Escribo una biblioteca de red y uso la semántica de movimientos en gran medida para manejar la propiedad de los descriptores de archivos. Uno de mi clase desea recibir las envolturas de descriptor de archivo de otros tipos y tomar posesión, por lo que es algo así como¿Cómo hacer que el parámetro de referencia de rvalue de la plantilla ÚNICAMENTE se vincule con la referencia rvalue?
struct OwnershipReceiver
{
template <typename T>
void receive_ownership(T&& t)
{
// taking file descriptor of t, and clear t
}
};
Tiene que tratar varios tipos relacionados de manera receive_ownership tiene que ser una plantilla, y para estar seguro, me gustaría ÚNICAMENTE se une a las referencias rvalue, de modo que el usuario tiene que indicar explícitamente std :: move al pasar un lvalue.
receive_ownership(std::move(some_lvalue));
Pero el problema es: C++ deducción plantilla permite una lvalue a ser aprobada en sin esfuerzo adicional. Y en realidad me pegué un tiro en el pie una vez al pasar accidentalmente un lvalor para recibir la propiedad y usar ese lvalue (despejado) más tarde.
Así que aquí está la pregunta: ¿cómo hacer que una plantilla ÚNICAMENTE se vincule a la referencia rvalue?
Usted puede usar 'std: : is_rvalue_reference' en su lugar – David
Gracias Howard, eso funciona bien. Y Dave, pensé exactamente lo mismo que al principio, luego encontré std :: is_rvalue_reference no va a funcionar: no se une a un valor real "r" ni a std :: move() ed lvalue . –
@Ralph: ¿Intentó 'is_rvalue_reference :: value'? (Observe el '&&') –
fredoverflow