什么是未命名左值?

问题描述 投票:0回答:1

我在草稿N4268下面划线的部分看到了一个叫做“未命名左值”的概念

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

我搜索了很多,但 stackoverflow 和 google 都没有给我答案。 我只找到了这篇关于价值类别的帖子

什么是右值、左值、x值、左值和纯右值

但这并没有帮助。

c++ language-lawyer lvalue value-categories
1个回答
4
投票

并非所有左值表达式都有名称。事实上,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 or str1 = str2 or ++iter

  • 内置预自增和预自减、解引用、赋值和复合赋值、下标(数组 xvalue 除外)、成员 访问(xvalues 的非静态非引用成员除外,成员 枚举器和非静态成员函数),通过成员访问 如果左侧操作数是左值,则指向数据成员的指针,逗号 运算符(如果右侧操作数是左值)、三元条件 if 第二个和第三个操作数是左值。

  • 将表达式转换为左值引用类型。

  • 字符串文字

但是,这一切都无关紧要,因为更改的范围是提案允许对所有非类型模板参数进行持续评估

© www.soinside.com 2019 - 2024. All rights reserved.