8

重複の可能性:
std::string x(x);

class A {};

int main() {

    A a(a);
}

これはコンパイルされます。

gcc (GCC) 4.7.2 20120921 (レッドハット 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

何が起きてる?また、誤ってこれを行うのを防ぐにはどうすればよいですか? - コンパイル エラーにすることはできますか?

4

1 に答える 1

10

(§ 3.3.2/1)名前の宣言のポイントは、完全な宣言子 (第 8 節) の直後で、初期化子(存在する場合) の前です。ただし、以下に示す場合を除きます。[ 例:

int x = 12;
{ int x = x; }

ここで、2 番目の x は独自の (不確定な) 値で初期化されます。—終わりの例]

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

于 2012-10-09T01:37:36.417 に答える