3

重複の可能性:
自己初期化は '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;
}

xinmainはまだ指定され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 -Wextragccのバグですか、完全に有効な動作ですか、それとも灰色の領域のようなものですか?

(いずれにせよ、デバッグは本当に面倒です。)

4

0 に答える 0