关于c ++:对于非内置类型,有一个函数返回const值的用例是什么?

What are the use cases for having a function return by const value for non-builtin type?

最近我已经了解到,当从函数中按值返回以限定非内置类型的返回类型const时,这是有意义的,例如:

1
2
3
4
const Result operation() {
    //..do something..
    return Result(..);
}

我正在努力理解这一点的好处,一旦对象被返回,那么调用方肯定会选择是否将返回的对象设置为const?


基本上,这里有一个轻微的语言问题。

1
2
3
4
5
std::string func() {
    return"hai";
}

func().push_back('c'); // Perfectly valid, yet non-sensical

返回常量值是防止此类行为的一种尝试。然而,在现实中,它确实弊大于利,因为现在右值引用出现在这里,您只需要防止移动语义,这很糟糕,而且通过明智地使用右值和左值*this重载可能会阻止上述行为。另外,不管怎样,你还是得做个白痴才能做到这一点。


它偶尔有用。请参见此示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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;
}

注意,operator+返回的值通常被视为临时值。但它显然正在被修改。这不是我们想要的。

如果将operator+的返回类型声明为const I的返回类型,则无法编译。


按值返回没有好处。这没有道理。

唯一的区别是它阻止人们将其用作左值:

1
2
3
4
5
6
7
8
9
10
11
class Foo
{
    void bar();
};

const Foo foo();

int main()
{
    foo().bar(); // Invalid
}