c++ c++11 constructor defaulted-functions

c++ - = predeterminado ignora el especificador de acceso?



c++11 constructor (1)

Este es un error gcc. El error 57913 contiene un ejemplo casi idéntico al tuyo. El error 56429 contiene enlaces a varios informes de errores relacionados, de los cuales el error 54812 se ha corregido en gcc 4.9, que de hecho rechaza su código.

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

Demo en vivo

Me pareció bastante extraño que el siguiente programa aún se compilara bien a pesar de que el constructor predeterminado es private (4.8.1 g ++):

class A{ private: A() = default; A(const A&) = default; }; int main(){ A a; }

Actualmente desde 8.4.2 [2] de la norma (N3242)

Una función explícitamente predeterminada puede declararse constexpr solo si se hubiera declarado implícitamente como constexpr. Si se omite explícitamente en su primera declaración,

- Será público.

..........

¿Cuál es exactamente el propósito de que el especificador predeterminado ignore la especificación de acceso? Siento que eso podría causar un problema de interfaz no justificado por el diseñador de la clase que no quería que los usuarios crearan valores predeterminados, sino que necesitaba el constructor predeterminado en la implementación. Pensé que tal vez es porque el constructor predeterminado normalmente es public y por lo tanto el objetivo default es replicarlo, pero eso no responde por qué =default en el constructor de copia no ignora la especificación 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 }

En realidad no puedo ver en el estándar donde se menciona que los constructores / asignaciones de copy/move predeterminados explícitamente no se hacen public .