在以下代码段中,为什么该行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
您可以修改类类型的返回类型(通过在其上调用非const方法):
来自n4140的3.10 / 5
5一个对象的左值是修改该对象所必需的,但在某些情况下,也可以使用类类型的右值来修改其引用。[示例:调用对象的成员函数(9.3)可以修改该对象。—结束示例]
您的代码:
o.margin() = m;
实际上与
o.margin().operator=( Margin(m) );
因此,如果将非const方法更改为:
o.margin().val = m;
那么你会得到一个错误。
另一方面,这里:
o.zoomLevel()= 2;
zoomLevel()
返回非类类型,因此您无法对其进行修改。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句