2013-02-22 2 views
5

Код:Частные и конструктор по умолчанию в C++ 11 и НКУ

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 конструктора А), проблем нет.
  • Если я использую второй конструктор, gcc говорит мне, что D::D() является закрытым.

Вопрос: если я использую конструкторы по умолчанию, почему проблемы исчезают? Если у A есть частные конструкторы, другие классы никогда не смогут создавать экземпляры A, даже не имеющие его производные классы, независимо от «нестандартности» реализации его конструктора.

ответ

5

Это пахнет ошибкой GCC .

Ни в целом разделе 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

Ни с 'line X' прокомментировал? –

+0

@ Peregring-lk: Я обновил свой ответ –

+0

Зарегистрировано как http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56429 –

Смежные вопросы