web-dev-qa-db-ja.com

非組み込み型の関数がconst値で返されるようにするためのユースケースは何ですか?

最近、関数から値で返すときに、戻り値の型constを非組み込み型に限定することが理にかなっていることを読みました。例:

const Result operation() {
    //..do something..
    return Result(..);
}

私はこれの利点を理解するのに苦労しています。オブジェクトが確実に返されたら、返されるオブジェクトをconstにするかどうかを決定するのは呼び出し元の選択ですか?

43
Graeme

基本的に、ここにはわずかな言語の問題があります。

std::string func() {
    return "hai";
}

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

Constの右辺値を返すことは、そのような動作を防ぐための試みです。ただし、実際には、右辺値の参照がここにあるので、移動のセマンティクスを防ぐだけで、上記の動作は右辺値と左辺値の賢明な使用によっておそらく防止されるため、それは良いことよりもはるかに害があります*thisオーバーロード。さらに、とにかくこれを行うには、少しモロンである必要があります。

38
Puppy

値で返す場合、メリットはありません。それは意味がありません。

唯一の違いは、人々がそれを左辺値として使用できないことです。

class Foo
{
    void bar();
};

const Foo foo();

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