You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++23中模板模板参数的Concept与typename兼容性是否为定义行为?

C++23中模板模板参数与带约束模板的匹配行为分析

1. 接受typename的模板模板参数传入带concept约束的模板

这是符合C++23标准的定义行为。

C++23规定,当模板模板参数的形参是无约束的typename类型参数时,实参可以是带concept约束的同元数模板——只要该concept约束的是类型参数。带约束的模板本质还是接受类型参数的模板,只是对参数加了额外校验,完全满足“接受一个typename参数的模板”这一要求。

结合示例代码来看:

  • 模板B接受受MyConcept约束的类型参数,本质仍是单参数类型模板;
  • 模板A的模板模板参数TT要求“接受一个typename参数的模板”,B完全符合要求,因此A<B>实例化合法;
  • 用int实例化Type时,int满足MyConcept约束,decltype(a)::Type<int>的实例化也合法。

代码验证:

#include <iostream>
#include <type_traits>

template<typename T>
concept MyConcept = std::is_integral_v<T> || std::is_floating_point_v<T>;

template<template<typename> typename TT>
struct A {
    template<typename T>
    using Type = TT<T>;
};

template<MyConcept T>
struct B {
    T bb;
};

int main(int argc, char** args)
{
    auto a = A<B>{}; // 合法,符合标准
    auto b = decltype(a)::Type<int>{};
    return 0;
}

2. 接受concept约束的模板模板参数传入无约束的typename模板

这同样是符合C++23标准的定义行为。

C++23允许无约束类型模板匹配带concept约束的模板模板参数,核心要求是:用满足该concept的类型实例化模板实参时,结果必须合法。模板模板参数的约束是对“实例化传入参数”的限制,无约束模板可以接受任何类型,自然也能接受满足concept的类型,因此可以适配对应的模板模板参数。

结合示例代码来看:

  • 模板A的模板模板参数TT要求“接受一个受MyConcept约束的类型参数的模板”;
  • 无约束模板B可接受任何类型,包括满足MyConcept的int,因此B可作为实参传入A;
  • 用int实例化Type时,int满足MyConcept,TT<int>即B<int>实例化合法,整个流程符合标准。

代码验证:

template<template<MyConcept> typename TT>
struct A {
    template<typename T>
    using Type = TT<T>;
};

template<typename T>
struct B {
    T bb;
};

int main(int argc, char** args)
{
    auto a = A<B>{}; // 合法,符合标准
    auto b = decltype(a)::Type<int>{};
    return 0;
}

内容的提问来源于stack exchange,提问作者The Floating Brain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 12:33:18