c++ - 模板非类型参数

标签 c++ templates c++11 arguments linkage

$14.3.2 - "... A template-argument for a non-type, non-template template-parameter shall be one of:

...一个常量表达式 (5.19),指定具有静态存储持续时间和外部或内部链接的对象的地址或具有外部或内部链接的函数...“

在下面显示的代码中,我无法理解为什么不允许将“name2”和“name3”作为非类型模板参数。我在 Windows 上使用 gcc 4.7.2。

'name2' 和 'name3' 都是数组的名称,因此是常量表达式。此外,'name2' 具有内部链接,'name3' 具有静态和内部链接。

template<char const *p> void f()
{

}

char name1[] = "Hi";
static char name2[]= "Hi";
const static char name3[]= "Hi";
char *name4 = "Hi";

int main()
{
    f<name1>();
    f<name2>();
    f<name3>();
    f<name4>();
}

最佳答案

正如@Nawaz 正确猜测的那样,这是一个实现错误,而不是标准的一个深奥的角落。

具体来说,gcc 似乎有问题。除了最后一个 name4 是违反标准的,它的其余部分编译得很好 clang

关于c++ - 模板非类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14192936/

相关文章:

c++ - Visual Studio 文件只能用记事本打开

c++ - fstream 绝对路径不起作用

c++ - 这段 C++ 代码是如何工作的?

c++ - 如何使用可选的编译时参数声明模板函数?

c++ - 使用模板模板参数时是否需要显式列出默认参数?

c++ - 将非空终止的无符号字符数组复制到 std::string

c++ - 如何创建C++宏来定义使用调用另一个函数的参数列表的函数?

c++ - 如何根据结构中的某些字段在 C++ 中的结构 vector 中获取最小或最大元素

c++ - 来自另一个非静态的非静态成员初始值设定项

c++ - Windows 与 Linux 上 std::string 的可移植性和长度