#ИМЯ?

Мне показалось довольно странным, что следующая программа все еще скомпилирована, несмотря на конструктор по умолчанию 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.

Ответы

Ответ 1

Это ошибка gcc. Ошибка 57913 содержит пример, почти идентичный вашему. Ошибка 56429 содержит ссылки на несколько связанных отчетов об ошибках, из которых ошибка 54812 исправлена ​​в gcc 4.9, что действительно отклоняет ваш код.

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

Живая демонстрация