重複の可能性:
自己初期化は 'A a = a;' です。許可された?
次のコードを検討してください。
int main()
{
int x = x;
return 0;
}
それはコンパイルされますか?まあ、そうではないと思っていましたが、私のgcc-4.2.1によればそうです。値は指定されていないため、単純にint x;
.
ただし、次のような重要な結果があります。
int x = 44;
int main()
{
int x = x;
return 0;
}
x
inmain
はまだ指定されx
て::x
いません。
int x = x;
この場合、 は と同等であると主張できますint x; x = x;
が、適切なオブジェクトを使用すると、事態はさらに複雑になります。
class S
{
public:
S(): x(44) { std::cout << "constructor" << std::endl; }
S(const S &s): x(s.x)
{ std::cout << "copy " << this << " " << &s << std::endl; }
int getx () const { return x; }
private:
int x;
};
int main()
{
S s(s);
std::cout << s.getx() << std::endl;
return 0;
}
上記のコードは以下を出力します。
copy 0x7fff65ac1598 0x7fff65ac1598
0
したがって、明らかに、コピー コンストラクターに渡されるオブジェクトは、構築されていないゴミの袋です (コンパイルできれば驚くことではありません)。
を使用していても、コンパイル中に警告は表示されません-Wall -Wextra
。gccのバグですか、完全に有効な動作ですか、それとも灰色の領域のようなものですか?
(いずれにせよ、デバッグは本当に面倒です。)