可能性の重複:
std::string x(x);
なぜあなたは構築しているオブジェクトを渡すコピーコンストラクタを呼び出すことができますか? (C++)(GCC)
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
ここで何が起こっていますか? また、私は自分自身がこれを誤ってやってしまうのを防ぐ方法を教えてください。 - それはコンパイラエラーにすることは可能ですか?
より簡単な例である 'int i = i;'に注意してください。 – GManNickG
Clang 3.2は最近、そのようなケースを検出するためのアルゴリズムを見直しました。[uninitialized.cpp](http://llvm.org/svn/llvm-project/cfe/trunk/test/SemaCXX/uninitialized.cpp)ファイルを確認することができますテストスイートから警告を出すすべてのケースを確認します。 gccでは*初期化されていない*警告は潜在的に最適化レベルに結びついており、 'O1'または' O2'ビルドの場合にのみトリガされることに注意してください。 –