什么是未命名的左值?

时间:2015-07-16 08:16:17

标签: c++ lvalue

我在草案N4268中看到了一个名为“未命名的左撇子”的概念,但在下面的标题中是

  

[注意: Temporaries,未命名的左值和没有链接的命名左值当相应的template-parameter具有引用类型时,临时对象不是可接受的模板参数。 [例子:......]]

我搜索了很多,但stackoverflow和谷歌都没有给我一个答案。 我只发现了关于价值类别的这篇文章

What are rvalues, lvalues, xvalues, glvalues, and prvalues

但它没有帮助。

1 个答案:

答案 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