プログラムをデバッグしていると、次のようなコードを誤って入力してしまったことがわかりました。
//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 であると想定します。