gpt4 book ai didi

c++ - 模板非类型参数,C++11,字符串文字的限制

转载 作者:太空狗 更新时间:2023-10-29 21:18:55 25 4
gpt4 key购买 nike

模板非类型参数的限制规则说:

非类型、非模板模板参数的模板参数应为以下之一:

——对于整数或枚举类型的非类型模板参数,模板参数类型的转换常量表达式(5.19);或

——非类型模板参数的名称;或

——常量表达式(5.19),指定具有静态存储持续时间和外部或内部链接的对象或具有外部或内部链接的函数的地址,包括函数模板和函数模板-id,但不包括非静态类成员, 表示(忽略括号)为& id-expression,除了如果名称引用函数或数组时 & 可以省略,如果相应的模板参数是引用则应省略;或

— 计算结果为空指针值的常量表达式 (4.10);或

— 计算结果为空成员指针值的常量表达式 (4.11);或

——指向成员的指针,如 5.3.1 中所述。

2 [ 注意:字符串文字 (2.14.5) 不满足任何这些类别的要求,因此不是可接受的模板参数。

[ Example:
template<class T, const char* p> class X {
/ ... /
};
X<int, "Studebaker"> x1; // error: string literal as template-argument
const char p[] = "Vivisectionist";
X<int,p> x2; // OK
—end example ] —end note ]

那么为什么字符串文字不能用作非类型参数的参数呢?

const char arr[5] = "1234";

arr 与

具有相同的类型 const char[5]
"1234"; 

arr 具有外部链接,这就是为什么在 c++11 标准之前允许使用 arr 作为非类型模板参数。

但现在指向具有内部链接(静态存储)的对象的指针也允许用作非类型模板参数,并且字符串文字具有内部链接。

最佳答案

从您的问题来看,最接近允许的字符串文字是:

a constant expression (5.19) that designates the address of an object with static storage duration and external or internal linkage

字符串字面值既没有外部链接也没有内部链接,因此是不允许的。

如果您有多个翻译单元,每个翻译单元都包含 const char arr[5]; 的定义具有内部链接,那么这些都是不同的对象,具有不同的地址,但在一个翻译单元中,arr == arr , 总是。实现弄清楚了如何使它适用于模板参数。

如果您有多个翻译单元,每个翻译单元都包含 "1234" ,那么它们保证有不同的地址。然而,即使在单个翻译单元中,它们也不能保证具有相同的地址。

如果"1234" != "1234" , 然后引用模板 S<"1234">没有意义:您每次都会引用不同的模板实例化。

如果"1234" == "1234" ,然后实现变得复杂,以确保 S<"1234">在每个翻译单元中都是相同的类型。

关于c++ - 模板非类型参数,C++11,字符串文字的限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28763443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com