Estou lendo o código fonte STL e não tenho idéia do que o &&
operador de endereço deve fazer. Aqui está um exemplo de código de stl_vector.h
:
vector&
operator=(vector&& __x) // <-- Note double ampersands here
{
// NB: DR 675.
this->clear();
this->swap(__x);
return *this;
}
"Endereço do endereço" faz algum sentido? Por que ele tem dois operadores de endereço em vez de apenas um?
c++
stl
operator-keyword
memory-address
Anarki
fonte
fonte
&
, isso não teria nada a ver com o endereço do operador, mas, em vez disso, significa que__x
é uma referência.Respostas:
Este é o código C ++ 11 . No C ++ 11, o
&&
token pode ser usado para significar uma "referência de valor r".fonte
&&
é novo no C ++ 11.int&& a
significa "a" é uma referência de valor-r.&&
normalmente é usado apenas para declarar um parâmetro de uma função. E leva apenas uma expressão de valor-r. Se você não sabe o que é um valor r, a explicação simples é que ele não possui um endereço de memória. Por exemplo, o número 6 e o caractere 'v' são ambos valores-r.int a
, a é um valor l, no entanto(a+2)
é um valor r. Por exemplo:Espero que seja informativo.
fonte
int&& c = std::move( b );
etc.&&
é novo no C ++ 11 e significa que a função aceita uma RValue-Reference - ou seja, uma referência a um argumento que está prestes a ser destruído.fonte
Como outras respostas mencionaram, o
&&
token neste contexto é novo no C ++ 0x (o próximo padrão C ++) e representa uma "referência de valor r".As referências de valor são uma das coisas novas mais importantes no próximo padrão; eles permitem o suporte à semântica de 'movimentação' de objetos e permitem o encaminhamento perfeito de chamadas de função.
É um tópico bastante complexo - uma das melhores introduções (que não é meramente superficial) é um artigo de Stephan T. Lavavej, "Rvalue References: C ++ 0x Features in VC10, Part 2"
Observe que o artigo ainda é uma leitura bastante pesada, mas vale a pena. E mesmo estando em um blog do Microsoft VC ++, todas (ou quase todas) as informações são aplicáveis a qualquer compilador C ++ 0x.
fonte
&&
token em si não é novo; seu significado nas declarações é. Mas você sabia disso.Eu acredito que é um operador de movimento.
operator=
é o operador de atribuição, digamosvector x = vector y
. Aclear()
chamada de função soa como se estivesse excluindo o conteúdo do vetor para evitar um vazamento de memória. O operador retorna um ponteiro para o novo vetor.Deste jeito,
Mesmo que demos valores ao vetor a, o vetor b tem os valores. É a mágica do
operator=()
!MSDN - Como criar um construtor de movimentação
fonte