c++ - poner - Seleccione explícitamente la asignación de copia
no me andan los hashtags en instagram (2)
Puede static_cast
para const int&
:
test = static_cast<const int&>(3);
En C ++ 11, si tanto la asignación de copia como la de movimiento están disponibles, el compilador elige automáticamente la asignación de copia si el argumento es lvalue y la asignación de movimiento si es rvalue. Usando std::move
es posible seleccionar explícitamente la asignación de movimiento para lvalue. Pero, ¿cómo es posible seleccionar explícitamente la asignación de copia para rvalue?
Ejemplo de código:
#include <iostream>
class testClass
{
public:
testClass &operator=(const int &other) {
std::cout << "Copy assignment chosen." << std::endl;
return *this;
}
testClass &operator=(int &&other) {
std::cout << "Move assignment chosen." << std::endl;
return *this;
}
};
int main(int argc, char *argv[])
{
int a = 4;
testClass test;
test = a; // Selects copy assignment
test = 3; // Selects move assignment
test = std::move(a); // Selects move assignment
// test = std::copy(3); // <--- This does not work
return 0;
}
Una forma posible es escribir su propia copy
para enlazar el objeto a una referencia de valor l:
template <class T>
constexpr T& copy(T&& t) noexcept
{
return t;
}
Y puedes probarlo de esta manera:
test = copy(a);
test = copy(3);
test = copy(std::move(a));
Puede poner esta función en su propio espacio de nombres para mantener las cosas limpias. También puede elegir un nombre mejor para él.
Para abordar el tema del miedo a la vida, aquí hay algunas consideraciones:
- Esta función de
copy
toma una referencia y devuelve la misma referencia inmediatamente. Implica que la persona que llama es responsable de controlar la vida útil. - La vida útil de un objeto temporal persiste hasta el final de la declaración. Esto hace que el objeto persista lo suficiente como para pasarlo al lado izquierdo de
=
.