2013-04-07 95 views
2

這是我嘗試瞭解類初始化如何工作。我不確定所有事情,這就是爲什麼我問這個問題。這就是我相信,當我們做了以下情況:瞭解初始化過程

T t = u; 
  1. u構造T類型的對象。這則變爲:

    T t = T(u); 
    
  2. 調用拷貝構造函數:

    T t(T(u)); 
    

好了,二是我不理解的部分。我在某處讀到T t = u被製成T t(T(u))。但是,如果這爲什麼不打印不「拷貝構造函數」這是真的:

struct T 
{ 
    template <class U> 
    T(U) { 
    std::cout << "constructs an object of type T...\n"; 
    } 

    T(T const &) 
    { 
    std::cout << "copy-constructor"; 
    } 

    T& operator=(T const &) 
    { 
    std::cout << "assignment operator"; return *this; 
    } 

    T() = default; 
}; 

int main() 
{ 
    T t(T(5)); 
} 

其實,這一切確實是打印「構建類型T的對象」。爲什麼不是在這裏調用的複製構造函數? T(5)可以製作成類型爲T const &的對象,該對象被傳遞給T的構造函數,所以不應調用適當的構造函數。

我真的很想知道這個。我一直試圖理解這一點。

回答

4

這種情況有一個特殊的規則。編譯器允許跳過拷貝構造函數,即使它有副作用,假如表達式與拷貝構造函數一樣合法。所以

T t = u; 

是,如你所說,相當於

T t(T(u)); 

編譯器跳過複製構造函數和將這種情況視爲

T t(u); 

一種情況,這些都不會被允許將一個帶有私人拷貝構造函數的類。在這種情況下,T t(T(u));將不合法,並且不允許編譯器通過跳過複製構造函數使其合法化。

+0

謝謝,我的頭現在感覺好多了。 – user2030677 2013-04-07 17:16:42