2012-10-09 1 views
8

可能性の重複:
なぜあなたは構築しているオブジェクトを渡すコピーコンストラクタを呼び出すことができますか? (C++)(GCC)

std::string x(x);
class A {}; 

int main() { 

    A a(a); 
} 

これがコンパイル。

のgcc(GCC)4.7.2 20120921(Red Hatの4.7.2-2)
g++ -o main main.cpp -Wall -w -ansi

私は警告を受けていません。

これはなぜ有効なC++と思われますか?
これは標準のどこに記載されていますか?
gccでこれを報告できる警告フラグはありますか?

クラスにメンバーデータがある場合、データはランダムに終了します。
例:

#include <iostream> 

class A { 

public: 
    int i; 
    A() : i{6} {} 
}; 

int main() { 

    A a(a); 
    std::cout << a.i << '\n'; 
} 

出力:-482728464

ここで何が起こっていますか? また、私は自分自身がこれを誤ってやってしまうのを防ぐ方法を教えてください。 - それはコンパイラエラーにすることは可能ですか?

+2

より簡単な例である 'int i = i;'に注意してください。 – GManNickG

+1

Clang 3.2は最近、そのようなケースを検出するためのアルゴリズムを見直しました。[uninitialized.cpp](http://llvm.org/svn/llvm-project/cfe/trunk/test/SemaCXX/uninitialized.cpp)ファイルを確認することができますテストスイートから警告を出すすべてのケースを確認します。 gccでは*初期化されていない*警告は潜在的に最適化レベルに結びついており、 'O1'または' O2'ビルドの場合にのみトリガされることに注意してください。 –

答えて

10

名の宣言の点は以下に記載されている場合を除き、その完全な宣言(条項8)の後に、その初期(もしあれば)の直前である(3.3.2/1§)。 [例:

ここで、2番目のxは独自の(不確定な)値で初期化されます。 -end example]

これは、class Aなどのユーザー定義タイプにも適用されます。使用されるコピーコンストラクタはデフォルトのもので、コンパイラによって自動生成されます。