簡體   English   中英

=默認忽略訪問說明符?

[英]=default ignores access specifier?

我發現很奇怪,盡管默認構造函數是private (4.8.1 g ++),但下面的程序仍然編譯得很好:

 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

這是一個gcc bug。 錯誤57913包含一個幾乎與您相同的示例。 錯誤56429包含幾個相關錯誤報告的鏈接,其中錯誤54812已在gcc 4.9中修復,這確實拒絕了您的代碼。

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

現場演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM