【问题标题】:extern array as non-type template argument with clang c++1z外部数组作为clang c ++ 1z的非类型模板参数
【发布时间】: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 似乎是相关的。

标签: c++ clang c++17


【解决方案1】:

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

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

extern int const ai[4];

【讨论】:

    猜你喜欢
    • 2016-09-15
    • 1970-01-01
    • 2017-09-17
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 2014-04-18
    相关资源
    最近更新 更多