2

関数に署名があるとします

std::string GetString();

値によって新しい文字列を返します。次のコードが与えられます。

// (a) Store the return value to a const reference.
const std::string& my_string = GetString();

// (b) Store the return value to a (const) value.
const std::string my_string = GetString();

(a) と (b) は、C++11 コンパイラの観点からは同一であると理解するのは正しいですか? もしそうなら、スタイルの選択について大まかなコンセンサスはありますか?

4

2 に答える 2

1

(a) と (b) は、C++11 コンパイラの観点からは同一であると理解するのは正しいですか?

いいえ、それらは同一ではありません。

(a) によって返される一時オブジェクトの寿命を延ばしますGetString()

(b) 新しいオブジェクトを作成します。それは以下によって構築されます:

  1. std::stringの戻り値をGetString()引数として使用して のコピー コンストラクターを呼び出し、
  2. GetString()RTO によっての戻り値が割り当てられている、または
  3. の戻り値を使用して移動コンストラクターを呼び出しますGetString()
于 2015-11-03T06:20:07.723 に答える
0

理論的には異なりますが、実際には同じです。違いを見分けるために記述できる唯一のコードは、decltype(my_string).

コンパイラは、両方に対して同じアセンブリを生成する可能性があります。

于 2015-11-03T20:30:59.943 に答える