2015-11-07 228 views
6

是否有一個缺省用戶定義構造默認(用戶定義的)構造函數和構造函數與默認參數之間的區別?

class Simple 
{ 
public: 
    Simple() {} 
}; 

和用戶定義的構造函數的多個參數,但具有默認值對於每個這些

class WithDefaults 
{ 
public: 
    WithDefaults(int i = 1) {} 
}; 

其他的比WithDefaults也可以之間的任何差異用i的明確值構建?

具體而言,就語言而言,我想知道這兩個構造函數是否完全相同,或者兩個類的屬性之間存在細微差別?

換句話說,是一個構造函數,它的所有參數的默認值都是默認的構造函數嗎?

+0

我期待這是一個重複,實際上,但我無法找到任何答案。 – MicroVirus

+0

它幾乎*在[用C++構造函數的默認參數]回答(http://stackoverflow.com/questions/187640/default-parameters-with-c-constructors),我想,但我不確定。 – MicroVirus

+1

我認爲,這些課程是相同的。考慮到轉換時,他們的行爲可能會有所不同。 @MicorVirus的第二條評論中的鏈接進一步解釋了這一點。 –

回答

6

現行標準的工作草案N4527 [12.1p4]:

一個默認構造了一類X是類X 的構造函數,要麼沒有參數,否則這不是一個 每個參數函數參數包有一個默認參數。 [...]

所以是的,第二類的構造函數是一個完全有效的默認構造函數。


只是注意到C++ 11和14的發佈版本中的措辭略有不同,但對您的問題沒有什麼影響。它曾經是:

一個默認構造了一類XX類 的構造函數,可以不帶參數調用。

由於DR 1630,爲了闡明默認初始化的語義,對當前的措詞進行了更改。以前,標準中有些地方提到「默認構造函數」,這意味着只能有一個;目前的措辭旨在支持更復雜的場景,您可能會有幾個這樣的構造函數(例如使用SFINAE),並且使用正常的重載解析來選擇使用的場景。

+0

儘管*有* ABI兼容性考慮的一個小差異。 – Deduplicator

+1

@Deduplicator一個很好的觀點,但我認爲它屬於一般性陳述「對於所有參數都有默認參數的函數可以用與沒有任何參數的語法相同的語法來調用,但這並不意味着這兩個參數函數具有相同的簽名「。 – bogdan