我在草案N4268中看到了一个名为“未命名的左撇子”的概念,但在下面的标题中是
[注意:
Temporaries,未命名的左值和没有链接的命名左值当相应的template-parameter具有引用类型时,临时对象不是可接受的模板参数。 [例子:......]]
我搜索了很多,但stackoverflow和谷歌都没有给我一个答案。 我只发现了关于价值类别的这篇文章
What are rvalues, lvalues, xvalues, glvalues, and prvalues
但它没有帮助。
答案 0 :(得分:4)
并非所有左值表达式都有名称。实际上,N4296中的措辞给了我们一些例子:
对于引用或指针类型的非类型模板参数, 常量表达式的值不应引用(或指针 类型,不应是地址:
- 子对象(1.8),
- 临时对象(12.2),
- 字符串文字(2.14.5),
- typeid表达式(5.2.8)或
的结果- 预定义的 func 变量(8.4.1)。
此外,cppreference关于价值类别的信息详细介绍了左值:
左值是一个表达式,用于标识非临时对象或 非会员职能。
以下表达式是左值:
范围内的变量或函数的名称,无论其类型如何,例如std :: cin或std :: endl。即使变量的类型是rvalue 引用,由其名称组成的表达式是左值 表达
函数调用或重载运算符表达式,如果函数或重载运算符的返回类型是左值引用,例如 std :: getline(std :: cin,str)或std :: cout<< 1或str1 = str2或++ iter
内置预增量和预减量,取消引用,赋值和复合赋值,下标(数组xvalue除外),成员 访问(xvalues的非静态非引用成员,成员除外) 枚举器和非静态成员函数),成员访问通过 如果左侧操作数是左值,则为指向数据成员的指针,逗号 运算符如果右手操作数是左值,则三元条件if 第二和第三个操作数是左值。
将表达式转换为左值引用类型。
字符串文字
但是,这一切都无关紧要,因为更改的范围是提案Allow constant evaluation for all non-type template arguments。