[解決済み] const参照クラスのメンバはテンポラリーを長持ちさせるか?
2022-04-15 17:09:08
質問
なぜ、このような
#include <string>
#include <iostream>
using namespace std;
class Sandbox
{
public:
Sandbox(const string& n) : member(n) {}
const string& member;
};
int main()
{
Sandbox sandbox(string("four"));
cout << "The answer is: " << sandbox.member << endl;
return 0;
}
の出力を与える。
<ブロッククオートという答えが返ってきます。
の代わりに。
答えは、「4」です。
解決方法は?
唯一
ローカル
const
を参照することで、寿命が延びます。
標準では、参照宣言の初期化子に関するセクションである §8.5.3/5, [dcl.init.ref] でそのような動作が規定されています。あなたの例での参照は、コンストラクタの引数
n
というオブジェクトが存在する場合、無効となります。
n
にバインドされているものがスコープ外に出てしまう。
寿命延長は関数引数を介しての推移的なものではありません。§12.2/5 [class.temporary]を参照してください。
2つ目のコンテキストは、参照がテンポラリにバインドされている場合です。参照が束縛されているテンポラリ、またはテンポラリが束縛されているサブオブジェクトの完全なオブジェクトであるテンポラリは、以下に指定する場合を除き、参照の寿命まで永続する。コンストラクタのCTOR-INITIALIZER (§12.6.2 [class.base.init]) の中で参照メンバに束縛された一時は,コンストラクタが終了するまで持続する。関数呼び出し (§5.2.2 [expr.call]) における参照パラメータへの一時的なバインドは、呼び出しを含む完全な式が完了するまで持続する。
関連
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み】なぜC++プログラマは'new'の使用を最小限に抑えなければならないのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】構造体のベクター初期化について
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された