C++:返回值是L值吗?

标签 c++ return-value lvalue

考虑这段代码:

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/

相关文章:

C++:如何防止通过指向派生对象的基子对象的指针修改派生对象?

c++ - 编译器是否管理使用模板元编程生成的重复类型

c++ - 在 C++ 中返回对象或指针

c++ - C 中的左值必需错误

c++ - std::common_type 应该使用 std::decay 吗?

c++推导 "non type pointer to function"类模板参数

c++ - (C++ 和 OpenGL)我试图在批处理渲染器中旋转一组顶点(它将模拟一个正方形),但它不是 100% 工作 :(

c++ - 成员函数能否返回对右值对象的可修改左值引用?

javascript - 从 javascript 函数返回 true 或 false

ios - 如何在 if 语句中成功调用 BOOL 方法?