c++ 什么是未命名的左值?

oaxa6hgo  于 2023-10-21  发布在  其他
关注(0)|答案(1)|浏览(126)

我在N4268草案中看到了一个名为“未命名左值”的概念,在下面的删除线部分
[注:临时对象、未命名左值和没有链接的命名左值是临时对象,当相应的模板参数具有引用类型时,临时对象不是可接受的模板参数。[示例:.] ]
我已经搜索了很多,但无论是stackoverflow还是谷歌给了我一个答案。我只找到这篇关于价值分类的文章
What are rvalues, lvalues, xvalues, glvalues, and prvalues
但没有用。

7z5jn7bk

7z5jn7bk1#

并非所有左值表达式都有名称。事实上,N4296中的措辞给了我们一些例子:
对于引用或指针类型的非类型模板参数,常量表达式的值不应引用(或对于指针类型,不应是的地址):

  • 子对象(1.8),
  • 临时对象(12.2),
  • 一个字符串文字(2.14.5),
  • typeid表达式的结果(5.2.8),或者
  • 一个预定义的func变量(8.4.1)。

此外,cppreference关于值类别的信息详细介绍了左值:
左值是标识非临时对象或非成员函数的表达式。
以下表达式是左值:

  • 作用域中变量或函数的名称,无论类型如何,如std::cin或std::endl。即使变量的类型是右值引用,由其名称组成的表达式也是左值表达式。
  • 函数调用或重载运算符表达式,如果函数或重载运算符的返回类型是左值引用,例如std::getline(std::cin,str)或std::cout << 1或str1 = str2或++iter
  • 内置预递增和预递减、解引用、赋值和复合赋值、下标(除了数组xvalue),成员访问(除了xvalues、成员枚举器和非静态成员函数的非静态非引用成员),如果左操作数是左值,则通过指向数据成员的指针访问成员,如果右操作数是左值,则通过逗号运算符访问成员,如果第二个和第三个操作数是左值,则为三进制条件。
  • 将表达式强制转换为左值引用类型。
  • 字符串文字

然而,这一切都无关紧要,因为变更的范围是提案Allow constant evaluation for all non-type template arguments

相关问题