【发布时间】:2016-07-01 13:44:36
【问题描述】:
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错误吗?还是这段代码错了?
【问题讨论】:
-
"但它不是子对象。" 是的,它是一个子对象。 C++ 中的数组可以衰减为指向数组中第一个子对象元素的指针。现在,这并不是说编译器应该为此失败。但它得到了一个指向子对象的指针。
-
@NicolBolas 有趣的是 [temp.arg.nontype]/1 禁止指向子对象的指针,然后the next paragraph 有一个与 OP 匹配的示例。
-
现在我完全糊涂了。我已经重新阅读了子对象的标准含义,是的,数组元素是子对象。看起来标准中没有任何内容允许将数组用作指针非类型模板参数。不仅是 extern,还有任何数组。
-
CWG 2043 似乎是相关的。