Qual é R-valor de referência que está prestes a entrar em próxima c ++ padrão?
-
21-08-2019 - |
Pergunta
O que é R-valor de referência que está prestes a entrar em próxima c ++ padrão?
Solução 3
Aqui é um tempo muito longo artigo de Stephan T. Lavavej
Outras dicas
Dê uma olhada Por que C ++ 0x rvalue não referência o padrão? , o que explica seu uso prático muito bem.
Ele permite que você distinguir entre código que chamou você passar uma referência a um valor de r ou um l-value. Por exemplo:
void foo(int &x);
foo(1); // we are calling here with the r-value 1. This would be a compilation error
int x=1;
foo(x); // we are calling here with the l-value x. This is ok
Ao utilizar uma referência r-valor, que pode permitir a passagem em referências para os temporários, tais como no primeiro exemplo acima:
void foo(int &&x); // x is an r-value reference
foo(1); // will call the r-value version
int x=1;
foo(x); // will call the l-value version
Esta é mais interessante quando estamos querendo passar o valor de retorno de uma função que cria um objeto para outra função que utiliza esse objeto.
std::vector create_vector(); // creates and returns a new vector
void consume_vector(std::vector &&vec); // consumes the vector
consume_vector(create_vector()); // only the "move constructor" needs to be invoked, if one is defined
O construtor movimento actua como o construtor de cópia, mas está definido para dar uma referência r-valor, em vez de uma referência de l-valor (const). É permitido o uso de semântica valor-R para mover os dados fora do temporário criado no create_vector
e empurrá-los para o argumento para consume_vector
sem fazer uma cópia caro de todos os dados no vetor.