initialize dev compiler c++ c++11 constructor standards access-rights

c++ - dev - ¿Debe un constructor eliminado ser privado?



c++17 (2)

class A { public: A() = default; A(const A&) = delete; }; class A { public: A() = default; private: A(const A&) = delete; };

¿Son estas dos definiciones siempre idénticas entre sí en algún caso?


Quiero extender la respuesta de Daniel Frey . En lugar de hacer que los métodos eliminados sean siempre public , preferiría dar a estos métodos el modificador de acceso que daría ( hipotéticamente ) a estos métodos si no se eliminaran. (No me gusta siempre en caso de que un programador tenga una opción. Si de hecho estuviera tallado en piedra para hacer public métodos eliminados, el lenguaje debería hacerlo cumplir).

Algunas reglas de oro / directrices:

  • Los operadores de asignación de copia y movimiento serán public en clases concretas y abstractas para la mayoría de los casos .
  • Los constructores de copiar y mover serán public en clases concretas para la mayoría de los casos .
  • Los constructores de copiar y mover estarán protected en clases abstractas para la mayoría de los casos .
  • Los constructores de copiar y mover serán private en clases final concretas que solo pueden ser instanciadas por friends en la mayoría de los casos .

En todos los casos, usted hace un anuncio a los usuarios apropiados de una clase en lugar de a todos los usuarios de una clase.


Son diferentes solo los diagnósticos producidos . Si lo hace private , se reporta una violación de acceso adicional y superflua:

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

resulta en la siguiente salida adicional de GCC 4.8:

main.cpp: In function ''int main()'': main.cpp:6:5: error: ''A::A(const A&)'' is private A(const A&) = delete; ^ main.cpp:12:10: error: within this context A a2=a; ^

De ahí mi recomendación de siempre hacer public métodos eliminados.