Мне показалось странным, что следующая программа все еще скомпилирована нормально, несмотря на то, что конструктор по умолчанию 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
,
Это ошибка GCC. Ошибка 57913 содержит пример, почти идентичный вашему. Ошибка 56429 содержит ссылки на несколько связанных сообщений об ошибках, из которых ошибка 54812 было исправлено в gcc 4.9, который действительно отклоняет ваш код.
error: 'constexpr A::A()' is private
Других решений пока нет …