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
这是一个铿锵的虫子吗?或者这段代码错了吗?
答案 0 :(得分:2)
是的,它是一个clang bug,由clang开发人员确认并已在trunk(r311970)中修复。 http://lists.llvm.org/pipermail/cfe-dev/2017-August/055249.html
同时,要解决它,你需要在声明中明确地写出数组的长度。
extern int const ai[4];