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

extern array as non-type template argument with clang c++1z

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

如果我尝试使用 "clang++ -std=c++1z" 编译此代码,则会导致错误:

test.cpp:4:3: error: non-type template argument refers to subobject '&ai'

但它不是子对象。

http://en.cppreference.com/w/cpp/language/template_parameters 没有为非类型参数的“(C++17 起)”部分中的外部数组列出任何合适的限制。

此类代码在 -std=c++14 下运行良好。并且 GCC 在 c++1z 模式下也编译无误:https://godbolt.org/g/K9wZ4g

这是一个 clang 错误吗?还是这段代码有误?

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

同时,要解决这个问题,您需要在声明中明确写入数组的长度。

extern int const ai[4];