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

能否将花括号初始化列表作为模板实参?是否符合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++标准?未来会不会被判定为非法而失效?


补充编辑

  1. 查看GCC bug 111277的回复后确认,GCC确实实现了CWG 2450决议的内容,当前行为属于预期,但目前仅GCC支持该特性。
  2. 按此写法编写的代码也可在MSVC下编译通过。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 21:29:52