Clang与GCC对含非类型模板参数的代码接受度不一,是否符合C++20/23规范?
结论
这段代码不是合法的C20/23代码,GCC能编译是因为实现了标准未规定的非标准扩展,Clang的编译报错行为符合C标准要求。
具体原因
- 首先,模板实参的语法要求每个实参都必须是一个合法的表达式,而
{2,5}是花括号初始化列表,它本身不属于表达式,没有对应类型,无法直接作为非类型模板参数(NTTP)的实参传递。 - C++20虽然支持了类类型作为非类型模板参数,但并没有允许直接将裸花括号初始化列表放在模板参数列表中完成参数构造,只有允许拷贝初始化的上下文才可以隐式用花括号列表构造对象,模板参数列表不属于这类上下文。
- 你代码里的
xarray<int, 2>写法合法是因为字面量2是int类型表达式,可以触发arg的单参数constexpr构造函数完成隐式转换,符合常量表达式转换的要求。
跨编译器兼容修正方案
把xarray<int, {2,5}>改为显式构造的写法即可在GCC、Clang都正常编译:
xarray<int, arg{2,5}> arr2;
内容的提问来源于stack exchange,提问作者NoSenseEtAl
相关产品推荐
相关产品推荐

