考虑这段代码:
struct foo
{
int a;
};
foo q() { foo f; f.a =4; return f;}
int main()
{
foo i;
i.a = 5;
q() = i;
}
没有编译器提示它,即使是 Clang。为什么 q() = ...
行是正确的?
最佳答案
不,函数的返回值是左值当且仅当它是引用 (C++03)。 (5.2.2 [expr.call]/10)
如果返回的类型是基本类型,那么这将是一个编译错误。 (5.17 [expr.ass]/1)
这样做的原因是您可以在类类型的右值和 foo
的分配上调用成员函数(甚至是非const
成员函数) > 是实现定义的成员函数:foo& foo::operator=(const foo&)
。第 5 节中对运算符的限制仅适用于内置运算符,(5 [expr]/3),如果重载决议为运算符选择重载函数调用,则该函数调用的限制适用而是。
这就是为什么有时建议将类类型的对象返回为 const
对象(例如 const foo q();
),但这可能会产生负面影响在 C++0x 中,它可以阻止移动语义正常工作。
关于C++:返回值是L值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6111905/