问题描述
|
最近我读到,当从函数按值返回以使返回类型const限定非内置类型时是有意义的,例如:
const Result operation() {
//..do something..
return Result(..);
}
我正在努力了解这样做的好处,一旦确定要返回对象,调用者就可以决定返回的对象是否应为const?
解决方法
基本上,这里有一个轻微的语言问题。
std::string func() {
return \"hai\";
}
func().push_back(\'c\'); // Perfectly valid,yet non-sensical
返回const rvalue是为了防止这种行为。但是,实际上,这样做弊大于利,因为既然右值引用在这里,您将只是防止移动语义,这很烂,并且明智地使用rvalue和左值*this
重载。另外,您无论如何都要白痴。
, 偶尔有用。请参阅以下示例:
class I
{
public:
I(int i) : value(i) {}
void set(int i) { value = i; }
I operator+(const I& rhs) { return I(value + rhs.value); }
I& operator=(const I& rhs) { value = rhs.value; return *this; }
private:
int value;
};
int main()
{
I a(2),b(3);
(a + b) = 2; // ???
return 0;
}
注意,由“ 4”返回的值通常被认为是临时的。但是它显然正在被修改。这不是完全想要的。
如果将the4ѭ的返回类型声明为const I
,则将无法编译。
, 按值返回时没有任何好处。这没有道理。
唯一的区别是,它阻止人们将其用作左值:
class Foo
{
void bar();
};
const Foo foo();
int main()
{
foo().bar(); // Invalid
}