2012-10-09 18 views
8

可能重複:
std::string x(x);爲什麼你可以調用一個拷貝構造函數傳入正在構造的對象? (C++)(GCC)

class A {}; 

int main() { 

    A a(a); 
} 

這將編譯。

海合會(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

這是怎麼回事? 另外,如何防止我意外地做到這一點? - 是否有可能使其成爲編譯器錯誤?

+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

(§3.3.2/1)的名稱的點聲明的立即是其完整的說明符(第8章)後和其初始化(如果有的話)之前,除了下面指出的。 [例如:

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

這裏第二個x用它自己的(不確定)值進行初始化。 - 示例]

這適用於用戶定義的類型,例如您的class A以及。使用的複製構造函數是默認的,由編譯器自動生成。