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

5

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector