小编iak*_*aks的帖子

是否可以将花括号初始化列表作为模板参数传递?

我有这门课

template <typename ValueType, std::size_t Size>
struct ArrayPrimitive
{
  constexpr ArrayPrimitive(const ValueType (&array)[Size]) {
    std::copy(array, array + Size, data_);
  }
  ValueType data_[Size];
};
Run Code Online (Sandbox Code Playgroud)

这是我尝试将字符串文字传递为 NTTP 的包装器。然后我利用 CTAD 声明这个变量模板

template <ArrayPrimitive array>
std::integral_constant<decltype(array), array> arr;
Run Code Online (Sandbox Code Playgroud)

然后在代码中使用它

for (auto i : arr<{{2,4,6}}>.value.data_) std::cout << i << std::endl;

它编译并正确打印所有值。

我使用的编译器是 gcc13.2,我知道它目前无法在 clang 上运行,因为 c++20 对 NTTP 类的支持还不存在。另外,VS Code 的代码分析器确实不喜欢模板实例化中的括号,这有点奇怪,因为它没有arr<"123">.

我想知道它是否符合标准并且不会因未来的变化而中断。

编辑:查看错误报告GCC bug 111277的答案,看来 GCC 确实实现了 CWG 2450,将其置于预期行为领域,但仅适用于这一个编译器。

EDIT2:如果我这样写的话,它似乎也可以用 MSVC 编译https://gcc.godbolt.org/z/1sThrse3x

c++ template-meta-programming c++20 ctad non-type-template-parameter

2
推荐指数
1
解决办法
119
查看次数