extern数组作为非类型模板参数与clang c ++ 1z

时间:2016-07-01 13:44:36

标签: c++ clang c++17

template<int const * pci> struct X {};
extern int const ai[];
X<ai> xi;
int const ai[] = {0,1,2,3};

如果我尝试使用&#34; clang ++ -std = c ++ 1z&#34;编译此代码。它会导致错误:

  

test.cpp:4:3:错误:非类型模板参数指的是子对象&#39;&amp; ai&#39;

但它不是子对象。

http://en.cppreference.com/w/cpp/language/template_parameters并未列出对于extern数组的任何合适限制(自C ++ 17开始)&#39;非类型参数的部分。

这样的代码可以正常使用-std = c ++ 14。 GCC也在c ++ 1z模式下编译它没有错误:https://godbolt.org/g/K9wZ4g

这是一个铿锵的虫子吗?或者这段代码错了吗?

1 个答案:

答案 0 :(得分:2)

是的,它是一个clang bug,由clang开发人员确认并已在trunk(r311970)中修复。 http://lists.llvm.org/pipermail/cfe-dev/2017-August/055249.html

同时,要解决它,你需要在声明中明确地写出数组的长度。

extern int const ai[4];