2012-05-07 54 views
-1

我知道,做一個構造是這樣的:=默認

foo()=delete; 

將使unnaccesible,但怎麼樣:

foo()=default; 

?我有時看到這個,但我不知道它的意思!

+1

http://en.wikipedia.org/wiki/C%2B%2B11#Explicitly_defaulted_and_deleted_special_member_functions –

+3

-1: 「這個問題不顯示任何研究工作」 –

+3

谷歌可能很難,因爲'default'具有另一個含義(並且這個新的只是在C++ 11中添加的)。 –

回答

0

它告訴編譯器猜測一個默認的構造函數,指出沒有參數的函數。如果沒有給出「刪除」,編譯器通常會這樣做。它在C++ 11中引入以及刪除選項。

4

在C++ 03中,如果您沒有定義任何構造函數,編譯器會爲您生成一個默認構造函數。但是,如果您確實定義了其他構造函數,編譯器不會生成默認構造函數(根本就不會)。

=default告訴編譯器生成一個默認的構造函數,即使你已經明確地定義了一些其他的構造函數。這是在C++ 11中添加的 - 在C++ 03(或98)中沒有辦法做到這一點。您明確定義的任何構造函數與編譯器默認生成的內容至少有一點不同。

0

編譯器會隱式生成默認構造函數,除非你自己明確定義了任何構造函數。

foo() = default;只是指示編譯器生成默認構造函數,即使您定義了非默認構造函數。它主要是foo() {}相同(但請參閱Kerrek SB's answer)。

+0

我不確定它是否*完全相當於'foo(){}'。有兩種情況可能不同,例如'struct s {int x; }'* default *編譯器生成(據我瞭解)將會是'constexpr foo(){}',這意味着s()。x'是一個'constexpr' ...將不得不驗證這個 –

+1

它*不*與* foo(){}'相同。後者不是微不足道的。 –

+0

@KerrekSB看起來你是對的,第12.1.5節:_「如果默認構造函數既不是用戶提供的,也不是......」。實際區別是什麼? –

8

以下是default的用法。回想一下,在爲了POD(「普通的舊數據」),一類類型必須平凡缺省構造

struct this_is_pod 
{ 
    int a; 
    double b; 
}; 

struct this_is_not_pod 
{ 
    char c; 
    float d; 
    this_is_not_pod() { } 
}; 

但是,如果我們喜歡什麼提供一種手段用一些不平凡的方式初始化班級成員?只是寫一個非默認構造函數不起作用:

struct foo 
{ 
    int m; 
    void * p; 
    foo(double q, Bar & o) : m(magic(q), p(o.gizmo(m, q)) { } 
}; 

現在foo POD,因爲它完全缺乏一個默認的構造函數。添加我們自己的默認構造函數,如foo() {},仍然不起作用,因爲現在默認的構造函數不是微不足道的。 C++ 11來救援與default

struct foo 
{ 
    int m; 
    void * p; 
    foo(double q, Bar & o) : m(magic(q), p(o.gizmo(m, q)) { } 
    foo() = default; // trivial! 
}; 

static_assert(std::is_pod<foo>::value, "You will never see this message."); 
+0

這並沒有說明「微不足道」的構造函數究竟意味着什麼,即爲什麼= default與{ – johnbakers

+0

@FellowsheeL不同。{}因爲標準是這樣說的。在第一個聲明中默認的構造函數是用戶聲明的,但不是用戶定義的。 –