¿Cómo hacer que la inicialización de copia sea privada en C++17?
En la siguiente simplificación de un ejemplo del mundo real, la intención es garantizar que un usuario de la clase A
solo pueda obtener referencias temporales a sus objetos (en mi ejemplo real, la clase A
es una clase de proxy utilizada para sobrecargar operadores en los valores de retorno de otras clases):
struct A {
static A foo() {
return A();
}
private:
A() {}
A(const A&) = default;
};
Espero que la asignación a a
falle, y esto es lo que sucede en C++14 y versiones anteriores:
main.cpp:11:11: error: calling a private constructor of class 'A'
A a = A::foo();
^
main.cpp:7:5: note: declared private here
A(const A&) = default;
^
Sin embargo, en C++17, esto no es un error ya que no hay una asignación ocurriendo, solamente a
está siendo inicializado mediante una copia. En este caso, ¿cómo puedo garantizar la semántica anterior? ¿Hay alguna forma de declarar que la inicialización por copia de A
también sea privada (preferiblemente sin modificar el tipo de retorno de foo)?
davy.ai
Una forma de hacer cumplir la semántica anterior en C ++17 es declarar que el constructor de copia de
A
estéeliminado
, además de hacerloprivado
. Esto evitará cualquier intento de inicialización por copia de un objeto de claseA
, y por lo tanto, hará cumplir la restricción de obtener solo referencias temporales a objetosA
.El código modificado se vería así:
Al agregar el especificador
= delete
al constructor de copia, cualquier intento de inicialización por copia de un objeto de tipoA
resultará en un error de compilación. Esto incluye el caso en que la inicialización por copia se realiza utilizando el resultado de una llamada de función, como enA a = A::foo();
.Tenga en cuenta que esta solución no requiere modificar el tipo de retorno de
foo()
, y por lo tanto no afecta la interfaz proporcionada porA
.