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