【发布时间】:2016-09-29 09:37:48
【问题描述】:
在下面的sn-p中,为什么o.margin() = m;行编译没有错误?它很容易值得警告,因为它几乎总是一个错误。我实际上会认为这是一个错误,因为它会将 R 值放在赋值的左侧。
#include <iostream>
struct Margin
{
Margin(int val=0) : val(val) {};
int val;
};
struct Option
{
Margin m;
int z=0;
Margin margin()const { return m; }
int zoomLevel() { return z; }
};
int main()
{
Option o;
std::cout << "Margin is: "<< o.margin().val << std::endl;
Margin m = { 3 };
// The following line is a no-op, which generates no warning:
o.margin() = m;
// The following line is an error
// GCC 4.9.0: error: lvalue required as left operand of assignment
// clang 3.8: error: expression is not assignable
// MSVC 2015: error C2106: '=': left operand must be l-value
o.zoomLevel() = 2;
std::cout << "Margin is: "<< o.margin().val << std::endl;
return 0;
}
输出:
Margin is: 0
Margin is: 0
【问题讨论】:
-
"为什么它不是警告" 因为它不是。你的实际问题是什么?
-
@king_nak 语言律师标签真的没必要。这是一个 QOI 问题,而不是语言问题。
-
我不熟悉标签或 QOI,但我的意思是它应该是“至少是一个警告”。我会认为它实际上是一个错误。
-
我认为,QOI 的意思是“实施质量”。这正是这件事的意义所在。尽管标准在技术上允许它(使 [language-lawyer] 不适用),但您想要编写这样的代码的原因几乎没有,因此质量实现可以说应该发出警告。很像条件表达式中允许赋值的方式,但 99% 的情况下,这不是您的本意,因此编译器现在在您编写
if (foo = 42)时会发出警告