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
相关产品推荐
相关产品推荐

