【问题标题】:What is an unnamed lvalue?什么是未命名的左值?
【发布时间】:2015-10-05 13:58:37
【问题描述】:

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

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

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

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

但这并没有帮助。

【问题讨论】:

标签: c++ lvalue


【解决方案1】:

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

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

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

  • 字符串字面量

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

【讨论】:

    猜你喜欢
    • 2013-03-23
    • 1970-01-01
    • 2011-07-05
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 2020-01-03
    • 1970-01-01
    相关资源
    最近更新 更多