c++ - 多重赋值 (a = b) = c 语法如何工作?

标签 c++ operators

假设 abc,像 (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/

相关文章:

c++ - gcc 的 STL 现在支持右值引用吗?

c++ - 访问数组中对象的成员函数

c++ - 函数的 const 参数是否自动通过引用传递?

c++ - 通过 >> 运算符将文件内容保存到变量

objective-c - 是什么 ? : operator

C++ Declspec 对齐

c++ - 私有(private)范围内私有(private)继承的动态向下转换

scala - < :<, <%<, = := work in the compiler? 的 Scala 实现究竟如何

c# - 您如何看待 C# 中的 ??= 运算符?

operators - XQuery:将一个值与多个值进行比较,如 SQL "in"命令