0

サンプルコードを考えると:

class Integer
{
    int i_;
public:
    Integer(int i) : i_(i) {}
    const Integer operator+(const Integer &arg) const { return Integer(i_ + arg.i_); }
};

operator+() が実際に const Integer を返すべきかどうか疑問に思い始めました。「Thinking in C++」の Bruce Eckel は、同様のケースの演算子のオーバーロードの例を提供しており、戻り値の型で const 修飾子を好むようです。それを使用する必要がありますか?その理由は?

一方、このクラスを使用してみましょう。

int main()
{
    Integer a(1), b(2);
    Integer c = a + b;
}

abの合計としてcを作成する場合、コンパイラはほとんどの場合コピー省略を実行し、Integer::operator+() はcが占める場所にその結果を直接作成します (「速度が必要ですか? 値で渡す」を参照してください)。しかし、Integer::operator+() の戻り値の型が const として宣言されている場合、ターゲットが非 const であるため、コンパイラは強制的にコピーを実行しませんか?

4

1 に答える 1

2

を返すと、次のInteger constようなことから保護されます。

(a + b) = c;

私はこれが大きな問題だと思ったことはありませんが、これを禁止すると、型は組み込み型のように振る舞います。戻り値の最適化に関しては、影響はありません。

クラスをコピーするのに非常にコストがかかり、右辺値参照を効果的にサポートするように作成できる場合は、これらのために回避したいかもしれませんconst が、実際には、そのようなクラスは無視できるほどまれであると思われます.

于 2012-08-23T16:18:49.333 に答える