0

関数から std::string& を返し、戻り値の型が代入の右辺値である場合、GCC から警告メッセージが表示されます。これは、参照渡しが正しくコピーされないためでしょうか? エラーは、スタックからすぐに削除されるため、一時的な値を渡していることを示しています。

考慮すべきコードを次に示します。私がやろうとしていることは問題ですか?

const std::string& TranslationTable::EnglishTranslate()
{
    return "end";
}

そしてメインの内部:

std::string me;
me = EnglishTranslate();

返された文字列の内容は に正しくコピーされmeますか?

4

2 に答える 2

3

const charによって示されるの配列は"end"、タイプ の一時オブジェクトに変換されますstd::string。その一時的なものは、戻るとすぐに破棄されEnglishTranslateます。これにより、返された参照がぶら下がったままになり、有効なオブジェクトを指していません。

返された参照をのコピー代入演算子に渡すとme、未定義の動作が発生します (演算子が実行すべきことを実行するように定義されていると仮定します)。

代わりに値で返すことをお勧めします。

std::string TranslationTable::EnglishTranslate()
{
    return "end";
}

戻り値へのコピーについて心配する必要はありません。コンパイラはコピーを完全に削除できます。

関数から参照を返す唯一の一般的な用途は、データ メンバーへの参照を返すことです。ローカル変数とは異なり、データ メンバーは関数の最後で破棄されません。例については、を参照std::vector::operator[]してください。

于 2013-02-19T22:18:06.577 に答える
2

私がしようとしていることは問題ですか?

はい。

C++11 標準のパラグラフ 12.2/5 によると:

関数 return ステートメント (6.6.3) の戻り値に一時的にバインドされているものの有効期間は延長されません。一時的なものは、return ステートメントの完全式の最後で破棄されます。

したがって、関数によって返される参照はぶら下がっており、逆参照すると未定義の動作が発生します。

于 2013-02-19T22:21:18.070 に答える