0

const参照に関していくつかの説明が必要です。 this linkから:
const参照を使用して一時オブジェクトの寿命を延ばす

const Foo &myFoo = FuncBar(); 

const参照は、ローカルオブジェクトの寿命を延長しました。しかし、彼らはconst参照を使用しましたが、私は増加しなかった「4」

Sandbox(const string& n) : member(n) {} 

文字列の寿命をthis linkをチェックしました。

Sandbox sandbox(string("four")); 


彼らは

のみローカルのconst参照が寿命を延ばす文を使用していました。

は、その後、第2のリンクにメイン関数に文字列「4」ローカルではなく、const参照nは、その寿命を延ばすべきではないのですか?
なぜ、二番目のリンクで寿命が長くならないのですか?

+4

"ローカル" のように "*ローカル変数*"。 –

+3

"four"の定義がリンクの後ろに隠れているので、あなたの質問は本当に自己完結型ではありません。関連する部品を[編集]できますか? – Angew

+0

私は最初のリンクでは、メイン関数のローカルな文字列 "four"ではないので、変数nは "4"へのローカルconst参照であることを意味していますか? – user3762146

答えて

2

あなたが参照した2つのリンクは、ローカルのconst参照の使用法を示し、その他の参照はクラスメンバconst参照の使用を示しています。

ローカルのconst参照を作成して一時オブジェクトを参照すると、このコンパイラでは、ローカルconst参照のスコープまでの一時的な存続期間が延長されます。

テンポラリを指すクラスメンバconst参照は、一時オブジェクトの存続期間が、クラスメンバ参照を初期化するために呼び出されるコンストラクタを超えて拡張されないため、予期しない結果につながります。答えの1つで説明したように、一時的なものはコンストラクターが完了するまで生き残ります。

からの回答を引用: Does a const reference prolong the life of a temporary?

寿命延長は、関数の引数によって推移されていません。第2コンテキストは、参照が一時的なものにバインドされている場合です。参照がバインドされている一時的オブジェクトまたは一時オブジェクトが一時的にバインドされているサブオブジェクトの完全オブジェクトである一時オブジェクトは、以下で指定されている場合を除いて参照の存続期間中存続します。コンストラクタのctor-initializer(§12.6.2[class.base.init])内の参照メンバへの一時的なバインドは、コンストラクタが終了するまで続きます。関数呼び出し(§5.2.2[expr.call])の参照パラメータへの一時的なバインドは、呼び出しを含む完全な式が完了するまで続きます。

正確に分析すると、どちらの場合でも、参照の初期化されたスコープが有効になるまで、一時的なライフが延長されることに気づくでしょう。参照が有効範囲外になるとすぐに、一時的に無効になります。

ローカルconst参照の場合、scopeは、tempに初期化されている関数の中にあります。 クラスメンバconst参照の場合、scopeはコンストラクタであり、tempに初期化されています。

また、このGOTWの記事をお読みください: https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/

関連する問題