2015-10-16 116 views
16

我發現它很奇怪的是,下面的程序仍然儘管默認構造爲private(4.8.1克++)編譯細:=默認忽略訪問說明符?

class A{ 
private: 
    A() = default; 
    A(const A&) = default; 
}; 

int main(){ 

    A a; 

} 
從8.4.2 [2]標準的(N3242)

其實

顯式默認函數只有在隱式聲明爲constexpr時纔可以聲明爲constexpr。如果明確拖欠首次聲明,

- 這應是公開的,

..........

究竟是爲默認的說明符的目的忽略訪問規範?我覺得這可能會導致類接口問題,類設計師不希望用戶創建默認值,但需要實現中的默認構造函數。我認爲這可能是因爲默認的構造函數通常是public,所以default的目的是複製它 - 但這並不能回答爲什麼=default複製構造函數不會忽略private規範。

class A{ 
private: 
    A() = default; 
    A(const A&) = default; 
}; 

int main(){ 

    A a; 
    A b(a); //error: constexpr A::A(const A&) is private 

} 

其實我無法從標準看它提到,明確,違約copy/move構造函數/任務不發public

回答

15

這是一個海灣合作委員會的錯誤。 Bug 57913包含一個與您的示例幾乎完全相同的示例。 Bug 56429包含指向幾個相關錯誤報告的鏈接,其中bug 54812已在gcc 4.9中修復,該代碼實際上拒絕了您的代碼。

error: 'constexpr A::A()' is private 

Live demo

+0

Alrighty,謝謝。我想我誤解了這個標準的引用。它完全特定於「constexpr」聲明的功能的上下文。 – Silversonic

+3

@Silversonic您引用了哪個版本的標準?我無法在N3337或N4296 – Praetorian

+0

中找到*它將公開*我正在查看N3242。如果我正在使用C++ 11,我認爲這是最好的一個?我應該換成N3337嗎? – Silversonic