【发布时间】:2011-08-31 23:58:43
【问题描述】:
考虑这段代码:
struct foo
{
int a;
};
foo q() { foo f; f.a =4; return f;}
int main()
{
foo i;
i.a = 5;
q() = i;
}
没有编译器抱怨它,即使是 Clang。为什么q() = ... 行是正确的?
【问题讨论】:
-
哇,好问题,+1。
-
你认为这段代码有什么问题?
q()返回一个结构,然后为它分配一个值。这有什么问题? -
@Andy:我认为这很容易出错,因为将值分配给返回值通常不会做任何事情(除非 operator= 正在做一些魔术,这可能是不好的设计实践)。我原以为这是一个警告,就像不使用局部变量一样。
-
@Andy Johnson:普遍存在的误解是人们认为您可以在赋值左侧使用的所有内容都必须是左值。在这种情况下,似乎违反了这一要求。但实际上并没有这样的要求。内置赋值确实需要它的 LHS 上的左值,但重载赋值不需要。在这种情况下,我们正在处理重载的,即使它并不明显。
标签: c++ return-value lvalue