假设 a
、b
和 c,像
是 (a = b) = c;
这样的语句如何在 C++ 中工作int
还是任何其他原始类型?
最佳答案
赋值表达式 a = b
在 C 中不是左值,但在 C++ 中是:
C11, 6.5.14(赋值运算符):
An assignment operator stores a value in the object designated by the left operand. An assignment expression has the value of the left operand after the assignment, but is not an lvalue.
C++14, 5.18 [expr.ass](赋值和复合赋值运算符):
The assignment operator (
=
) and the compound assignment operators all group right-to-left. All require a modifiable lvalue as their left operand and return an lvalue referring to the left operand.
在 C++ 从 C 演变而来的过程中,有几个表达式被制成“左值感知”,因为左值在 C++ 中比在 C 中重要得多。在 C 中,一切都是微不足道的(微不足道的可复制和微不足道的破坏,用 C++ 的话来说),所以左值到右值的转换(或“左值转换”,正如 C 所说的那样)并不痛苦。在 C++ 中,复制和破坏是非常重要的概念,通过使表达式保持左值性,可以避免大量复制和破坏,而这些复制和破坏本来就不需要。
另一个例子是条件表达式 (a ? b : c
),它在 C 中不是左值,但在 C++ 中可以是左值。
这种语言演变的另一个有趣的产物是 C 有四个明确定义的存储持续时间(自动、静态、线程本地、动态),但在 C++ 中这变得更加困惑,因为临时对象在几乎需要自己的存储持续时间的 C++。 (例如,Clang 内部有第五个,"full expression" storage duration。)临时变量当然是左值到右值转换的结果,所以通过避免转换,就少了一件需要担心的事情。
(请注意,所有这些讨论仅适用于各自的核心语言表达式。C++ 还具有单独的、不相关的 运算符重载 特性,它产生函数调用表达式,它具有所有常见的函数调用的语义,除了语法之外与运算符无关。例如,您可以定义一个重载的 operator=
,它返回一个纯右值或 void
如果您愿意.)
关于c++ - 多重赋值 (a = b) = c 语法如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39559526/