Is there a defect in the definition of the assignment operator?
在我的C++ 11标准的副本(ISO/IEC 1488∶2011(e))中,赋值运算符定义包括:
In simple assignment (=), the value of the expression replaces that of the object referred to by the left operand.
号
这不是说"右操作数的值"而不是"表达式的值"吗?目前,它似乎模糊不清,很容易被解释为"赋值表达式的值"。
短语"the expression"也在[expr.ass]的另一段中含糊不清地使用:
If the left operand is not of class type, the expression is implicitly converted (Clause 4) to the cv-unqualified type of the left operand
号
我想这里也有"右操作数"的意思,对吧?
这也是我能找到的关于赋值运算符效果的唯一定义。我错过什么了吗?
- 赋值表达式的值是右边的值…
- 这是&167;5.17/2–您缺少的是上下文中"表达式"的含义,它在&167;5.17/1中定义。
- @由于赋值表达式的值被定义为"引用左操作数的左值",所以它将是循环逻辑。
- @Ildjarn我没有看到任何定义这个上下文中表达式意义的东西。我在这里疯了吗?
- 左侧是左值而不是值。所以一个赋值中只有一个值。
标准通常假定读者有一些常识。
例如,在某些地方,它显然混淆了对象和类的概念。
这样做是为了避免通过文本中不必要的冗余来降低可读性,这符合干燥原则:不要重复自己。
- 混合对象和类有助于避免重复?无论如何,我认为语言规范的主要优点应该是避免歧义,而不是避免重复。
- 我的常识告诉我这是错误的。这就是为什么我想知道我是否遗漏了其他东西(也许在标准的其他地方有进一步的定义)。如果我没有,那就是一个缺陷——一个国际标准的措辞不应该太差。
- @Jojojapan:是的,例如,当您讨论"对象及其成员函数"而不是"类类型的对象及其最派生类型的成员函数"时。当然,从形式上讲,对象没有成员函数。
- @MSChanges处理这种情况的正确方法是定义缩写(例如,"对象的成员函数"是您给出的确切定义的缩写),然后使用这些缩写。使用缩写词或模棱两可的术语,没有适当的定义,既不是必要的,也不是良好的做法。
在这两种情况下,"左操作数"都是正确的:
被替换的值是左操作数引用的对象。它将获得右操作数的值,但这不是第一个引号所描述的部分。
将值赋给非类类型时,该值将清楚地转换为赋给对象的类型,即左操作数。
- 这不是我有问题的"左操作数"。它是"表达式",当它看起来应该是"右操作数"时。
- @sftrabbit:"操作数"是正在操作的对象;rhs怎么可能是操作数?
- @ildjarn运算符的两边都是该运算符的操作数,如语句"赋值在右操作数和左操作数的值计算之后排序"中所用。
- …另外,[赋值]表达式的值变成了左操作数的值,替换了以前的值。