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

C++20中概念与类同名的行为及模板声明合法性问询

问题解答

1. 声明template <struct C T> struct B {};是否合法?

该声明是合法的。根据C++标准规则,在模板参数列表中,struct C T属于非类型模板参数的声明:struct C是详述类型说明符,用于指定参数T的类型为之前定义的struct C;T是这个非类型参数的名称。这并非无名非类型参数,而是明确命名的、类型为struct C的非类型模板参数,完全符合标准语法。

代码中B<cc> b;可以正常编译也验证了这一点——cc是struct C类型的常量表达式,满足非类型模板参数的要求。

2. 能否同时定义同名的concept与类类型?若可以,如何指定使用该名称指代concept?

可以在同一作用域中同时定义同名的concept和类类型,二者属于不同实体(concept是模板,类是类型),C++标准允许这种名字重载。

要明确指代concept而非类类型,需根据语境消除歧义:

  • 在模板参数列表的约束语境中(比如template <C T>),编译器会优先将C解析为concept,无需额外修饰,这也是代码中A<int> a;能正常编译的原因。
  • 在普通语境中(比如表达式里),编译器会优先将C解析为类类型(类类型名字查找优先级更高)。此时要引用concept,需要用template关键字明确表明这是模板实例化,写法如下:
    bool b = template C<int>;
    
    这样编译器会将C解析为模板(即concept),而非类类型。

另外,代码中C c;报错是因为编译器优先把C解析为concept,但concept不能被实例化为对象;而struct C c2;通过详述类型说明符明确指定为类类型,因此可以正常编译。

内容的提问来源于stack exchange,提问作者ValueError

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 17:42:39