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

标签 c++ clang c++17

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];

关于c++ - 外部数组作为非类型模板参数与 clang c++1z,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38147062/

相关文章:

c++ - 两种插入 map 的方式之间的区别

c++ - 使用LLVM遍历AST

c++ - 为什么 strcmp 对 clang 是未知的?

c++ - 初始化类内的静态常量数组 - C++

c++ - 即使表达式为

c++ - 一个类需要什么来定义它的 vector ?

c++ - C++ 17 可以处理嵌套的可变参数模板吗?

C++ - 如何让多个线程写入一个文件

macos - 使用 llvm/clang 链接 "toy"操作系统

具有宽松类型要求的 C++17 lambda 捕获