= по умолчанию игнорирует спецификатор доступа?

Мне показалось странным, что следующая программа все еще скомпилирована нормально, несмотря на то, что конструктор по умолчанию private (4,8,1 г ++):

 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,

16

Решение

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

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

Живая демо

15

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

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

По вопросам рекламы [email protected]