const变量作为非类型模板参数(variable不能出现在常量表达式中)
const variable as non-type template parameter (VARIABLE cannot appear in a constant-expression)
为什么这样做?
char __nontype[] = "foo";
typedef TemplateClass<T, __nontype> MyClass;
但是这个(有一个常量变量)不是吗?
const char __nontype[] = "foo";
typedef TemplateClass<T, __nontype> MyClass;
编译器错误:
错误:'__nontype'不能出现在常量表达式中
错误:模板参数2无效
区别在于const
会影响链接。如果添加extern
,它会起作用。也就是说,据我所知:
14.3.2模板非类型参数[temp.arg.notype]
非类型、非模板模板参数的模板自变量应为以下之一:
- 积分常数表达式(包括可以用作5.19中描述的积分常数表达式的文字类类型的常数表达式);或
- 非类型模板参数的名称;或
- 常数表达式(5.19),指定具有静态存储持续时间和外部或内部链接的对象的地址,或具有外部或内部连接的函数的地址,包括函数模板和函数模板id,但不包括非静态类成员,表示为(忽略圆括号)&id表达式,除了&如果名称引用函数或数组,则可以省略;如果相应的模板参数是引用,则应省略;或
- 常数表达式,其评估为空指针值(4.10);或
- 常数表达式,其评估为空成员指针值(4.11);或
- 指向如5.3.1中所述的成员的指针
它也应该在没有CCD_ 3的情况下工作。允许对象具有内部链接,但编译器还不支持这种链接。这是C++11中的一个变化,以前的C++标准不允许这样做。
错误表明:结果不是一个常量表达式(在链接时已知,但在编译时未知)。
以下是将工作的示例:
typedef const char *nontype_t;
template <nontype_t> struct Y {};
char hello[] = "hello";
constexpr char* world = hello;
int main()
{
Y<hello> a;
}
相关文章:
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么"具有常量成员的结构"类型的指针不能指向"具有非常量成员的结构"?
- 为什么不能用常量表达式声明数组?
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- 生成 constexpr 字符串表,不能产生常量表达式
- 为什么C++编译器不能做更好的常量折叠?
- 为什么右值不能绑定到非常量左值引用,除了写入临时无效的事实?
- 错误:'new'不能出现在常量表达式中
- 为什么我不能将常量左值引用绑定到返回 T&&&的函数?
- 为什么我不能在非常量表达式上使用此模板阶乘函数?
- 不能(隐式地)从字符**转换为常量字符**吗?
- 为什么作为返回类型的右值引用不能初始化非常量引用?
- 为什么我不能使用与"常量字符*"相同的"const int*"创建一个 int 数组?
- 为什么我不能将 op 结果乘以常量特征张量数组
- 为什么我不能将 2 个常量字符* 连接到 std::string?
- 对类型 'A *' 的非常量左值引用不能绑定到不相关的类型 'std::shared_ptr<A>' 的值
- 为什么我不能在标头中只定义一个非常量 gloabal 变量?如果我使用命名空间,为什么我必须声明它"extern"?
- 为什么常量引用不能延长通过函数传递的临时对象的生存期?
- 为什么我们不能在声明之前使用预处理器 #define 常量