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

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

本文关键字:类型 参数 c++1z 数组 clang 外部      更新时间:2023-10-16
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:错误:非类型模板参数指向子对象'&ai'

但它不是主语。

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

使用-std=c++14可以很好地工作。并且GCC也可以在c++1z模式下编译它,没有错误:https://godbolt.org/g/K9wZ4g

是clang bug吗?还是这个代码错了?

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

同时,为了解决这个问题,你需要在声明中显式地写出数组的长度。

extern int const ai[4];