Код:
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):
D::D()
это личное.Вопрос: если я использую конструкторы по умолчанию, почему проблемы исчезают? Если A
имеет частные конструкторы, другие классы никогда не могут создавать экземпляры A
даже не его производные классы, независимо от «дефолтности» реализации его конструктора.
Это пахнет как 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).
Других решений пока нет …