能否将花括号初始化列表作为模板实参?是否符合C++标准?
关于C++类非类型模板参数写法的标准合规性确认
我定义了如下类模板,作为字符串字面量转非类型模板参数(NTTP)的通用包装器:
template <typename ValueType, std::size_t Size> struct ArrayPrimitive { constexpr ArrayPrimitive(const ValueType (&array)[Size]) { std::copy(array, array + Size, data_); } ValueType data_[Size]; };
接着利用类模板实参推导(CTAD)声明了变量模板:
template <ArrayPrimitive array> std::integral_constant<decltype(array), array> arr;
之后我在代码中这样使用:
for (auto i : arr<{{2,4,6}}>.value.data_) std::cout << i << std::endl;
这段代码在GCC 13.2下可以正常编译并输出所有值,但Clang因未完全支持C++20的类NTTP无法编译;VS Code的代码分析器对模板实例化中的嵌套括号存在提示,但对arr<"123">这种写法没有异议。
我想确认:这种写法是否符合C++标准?未来会不会被判定为非法而失效?
补充编辑
- 查看GCC bug 111277的回复后确认,GCC确实实现了CWG 2450决议的内容,当前行为属于预期,但目前仅GCC支持该特性。
- 按此写法编写的代码也可在MSVC下编译通过。
内容的提问来源于stack exchange,提问作者iaks
相关产品推荐
相关产品推荐

