En C++, ¿está garantizado que se creará un valor de retorno antes de que se destruyan las variables automáticas de la función? Aviso Cesta :: get:Valor de retorno de C++ creado antes o después de la destrucción automática de var.
class Basket
{
public:
// Gift is a struct containing safely copyable things like int or string
Gift gift;
// Used to protect access and changes to gift
Mutex mutex;
// Copy gift into present, while locked to be thread safe
void put (const Gift & gift)
{
Lock lock(mutex); // Constructor locks, destructor unlocks mutex
this->gift = gift; // Gift assignment operator
}
// Return a memberwise-copy of gift, tries to be thread safe (but is it?)
Gift get()
{
Lock lock(mutex); // Constructor locks, destructor unlocks mutex
return gift; // Gift copy constructor
}
};
necesito Cesta :: llegar a realizar su copia regalo constructor (temperatura del objeto devuelto) antes de la destrucción del objeto de bloqueo. De lo contrario, el objeto regalo que se devuelve puede corromperse mediante una llamada simultánea para poner.
Mis pruebas muestran que la copia del regalo se creó antes de la destrucción del bloqueo, sin embargo, ¿está garantizado? Si no, tendré que crear un segundo temporal dentro de la función, como por ejemplo:
Gift get()
{
Gift result;
{
Lock lock(mutex);
result = gift;
}
return result;
}
No existen registros en el estándar C++. (Bueno, existe la palabra clave 'register', pero eso perdió su significado hace mucho tiempo). Además, la mayoría de los objetos no cabrían en un solo registro, de todos modos. – fredoverflow
Si se devolvía un objeto local, entonces, seguro, tendría que copiarse antes de que se destruyera. Sin embargo, esto es otra cosa. Tengo un miembro de datos de la clase que se devuelve, por lo que la semántica de exactamente cuándo se produce la copia parece diferente. – maxpolk
@maxpolk Está devolviendo el miembro por valor. Habrá una copia a menos que el compilador pueda optimizarla para una asignación de referencia como mostró Remy. Si devolviera una referencia o un puntero, la cerradura aún se destruiría después. – AJG85