【问题标题】:Understanding lvalue concept理解左值概念
【发布时间】:2014-08-02 14:50:10
【问题描述】:

我在c++ 14 N3797 工作草案中阅读了有关lvalue 的概念,我对此有疑问。标准说:

秒。 3.10/1 N3797:

表达式根据图 1 中的分类法进行分类。

——一个 左值(所谓的,历史上,因为左值可能出现在 赋值表达式的左侧)指定一个函数或 一个东西。 [示例:如果 E 是指针类型的表达式,则 *E 是 一个左值表达式,指的是 E 所指向的对象或函数 点。再举一个例子,调用一个函数的结果 返回类型是左值引用是左值。 ——结束示例]

乍一看还可以。但是秒。 5/1 N3797 提供了表达式的定义。它说:

表达式是一系列运算符和操作数,它指定一个 计算

现在考虑秒。 5.4/1:

表达式 (T)cast-expression 的结果是类型 T。 如果 T 是左值引用类型或右值,则结果是左值 如果 T 是右值引用,则引用函数类型和 xvalue 对象类型;否则结果是纯右值。

我们知道lvalue 是定义的表达式(即运算符和操作数的序列),lvalue 的结果是lvalue(也是运算符和操作数的序列)。我不清楚表达式如何在评估后返回表达式(左值在我引用的 5.4/1 的引用中返回左值)。

你能解释一下吗?

【问题讨论】:

    标签: c++


    【解决方案1】:

    我认为这只是稍微草率的措辞。

    在 C++(以及 C)中,“左值”是一种表达式。而不是

    如果 T 是左值,则结果是左值 ...

    应该说:

    如果 T 是左值,则 表达式 是左值 ...

    多年来,“左值”一词的含义因一种语言而异。如果我没记错的话,最初的想法是“左值”是一种值,可以根据其左值(确定它指定的对象)或右值(确定一个值)来评估表达式。也许作者在写这句话时就想到了这个意思。

    【讨论】:

    • 看起来很合乎逻辑。感谢您的回答!
    • 再澄清一点:如果一个表达式被评估为右值,我们是否有一个该表达式返回的对象值的副本?
    • @St.Antario 这取决于很多事情,一般无法回答。
    • @St.Antario:将表达式评估为右值意味着获取表达式的值(通常意义上的)。根本就不一定有object;例如2+2 是一个带有左值的表达式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    相关资源
    最近更新 更多