3

プログラムをデバッグしていると、次のようなコードを誤って入力してしまったことがわかりました。

//Original (wrong)
std::string first("Hello");
std::string second = first + second;

//Instead of this (correct)
std::string first("Hello");
std::string second = first + something_else;

明らかに、私はこれをやろうとしていたわけではありません (なぜこれをやりたいのか、私にはわかりません) が、考えさせられました。オリジナルが機能するようには見えません。未定義であると思います。確かに、これが私の問題の原因でした。

問題をより一般化するために、次の点を考慮してください。

SomeType a;
SomeType b = a + b;

bまだ初期化されていないという理由だけで、動作は未定義ですか (この回答を参照してください)?

動作が定義されていない場合、私の本当の質問は、なぜですか?

これは のような特定の標準コンテナに対してのみ未定義ですかstd::string、それともより一般的な意味 (STL クラス、ユーザー定義クラス、POD、基本型) で未定義ですか?

規格のどの部分がこれに適用されますか?

必要に応じて、これが c++11 であると想定します。

4

3 に答える 3

6

C++11 標準では、新しく宣言された名前のスコープについて次のように述べています。

3.3.2 宣言のポイント [basic.scope.pdecl]

名前の宣言のポイントは、完全な宣言子 (第 8 節) の直後で、初期化子 (存在する場合) の前です。ただし、以下に示す場合を除きます。[ 例:

int x = 12;
{ int x = x; }

ここで、2 番目の x は独自の (不確定な) 値で初期化されます。— 終了例 ]

以前の C++ 標準にも同様の表現があります。

頭のてっぺんから、私が考えることができる1つの根拠は、オブジェクトのアドレスを取る初期化子式で名前を使用できるということです。

于 2012-04-28T00:03:57.610 に答える
1

初期化されていない変数を読み取ると、未定義の動作が発生する可能性があります。

規格には次のように書かれています。

初期化子 [dcl.init]

.......

オブジェクトに初期化子が指定されていない場合、オブジェクトはデフォルトで初期化されます。初期化が実行されない場合、自動または動的ストレージ期間を持つオブジェクトの値は不確定です。

于 2012-04-28T00:02:33.730 に答える