2013-02-22 49 views
5

代碼:私人和默認構造函數C++ 11和GCC

struct A 
{ 
    private: 
    A() = default; // Version 1. 
}; 
struct B : public A 
{}; 

struct C 
{ 
    private: 
    C() {}; // Version 2. 
}; 
struct D : public C 
{}; 

int main() 
{ 
    B b; // Compiles   under g++ 4.7.2 
    D d; // Compilation error under g++ 4.7.2 
} 

而兩種情況(用gcc 4.7.2):

  • 如果我編譯此代碼(與第1版A的構造函數),沒有問題。
  • 如果我使用第二個構造函數,gcc對我說D::D()是私有的。

問題:如果我使用默認構造函數,爲什麼問題會消失?如果A具有私有構造函數,那麼其他類永遠不會創建A的實例,甚至不會創建其派生類,但不考慮其構造函數實現的「默認性」。

回答

5

這聽起來像GCC bug給我。

關於成員訪問控制的整個第11章和關於默認構造函數的8.4.2都沒有提及任何有關覆蓋缺省構造函數的可訪問性級別。

此外,此代碼確實而不是在Clang 3.2和Intel ICC 13.0上編譯。

在另一方面,如果你對此有何評論線X,下面一行將做你認爲:

B b(); // This will declare a function that accepts no argument 
     // and returns a value of type B 

如果去掉括號,你應該看到問題雨後春筍般冒出來:

B b; // ERROR: Constructor of A is private 

但是,GCC 4.7.2(錯誤地)沒有引發編譯錯誤。這似乎還沒有在GCC 4.8.0的測試版本中修復(截至20130127版本)。

+0

既沒有'X行'評論? – 2013-02-22 17:22:55

+0

@ Peregring-lk:我更新了我的回答 – 2013-02-22 17:27:21

+0

報告爲http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56429 – 2013-02-22 21:50:56