Operador De Endereço Duplo C++? (&&)
estou a ler o código fonte STL e não faço ideia 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;
}
o "endereço de endereço" faz algum sentido? Porque é que tem dois operadores de endereços em vez de apenas um?
5 answers
Este é o código C++11. Em C++11, o token &&
pode ser usado para significar uma "referência rvalue".
&&
é novo em C++11, e significa que a função aceita um RValue-Reference -- Isto é, uma referência a um argumento que está prestes a ser destruído.
&&
é novo em C++11. int&& a
significa "a"é uma referência ao valor R. &&
é normalmente usado apenas para declarar um parâmetro de uma função. E apenas tem uma expressão de Valor r. Se você não sabe o que é um r-value, A explicação simples é que ele não tem um endereço de memória. Por exemplo, o número 6 e o carácter " v " são ambos valores R. int a
, a é um valor l, no entanto (a+2)
é um valor r. Por exemplo:
void foo(int&& a)
{
//Some magical code...
}
int main()
{
int b;
foo(b); //Error. An rValue reference cannot be pointed to a lValue.
foo(5); //Compiles with no error.
foo(b+3); //Compiles with no error.
int&& c = b; //Error. An rValue reference cannot be pointed to a lValue.
int&& d = 5; //Compiles with no error.
}
Espero que seja informativo.
Como outras respostas já mencionaram, o token &&
Neste contexto é novo em C++0x (a próxima norma C++) e representa uma "referência rvalue".
As referências de Rvalue são uma das coisas novas mais importantes na próxima norma; elas permitem o suporte para a semântica de' mover ' em objetos e permitem o encaminhamento perfeito das chamadas de funções.
É um tópico bastante complexo-uma das melhores introduções (que não é apenas superficial) é um artigo de Stephan T. Lavavej, "Rvalue References: C++0x Features in VC10, Part 2" Note que o artigo ainda é muito pesado, mas vale a pena. E mesmo que esteja em um blog Microsoft VC++, toda (ou quase toda) a informação é aplicável a qualquer compilador C++0x.operator=
é o operador da missão, digamos vector x = vector y
. A chamada de função clear()
soa como se estivesse a apagar o conteúdo do vector para evitar uma fuga de memória. O operador devolve um ponteiro ao novo vector.
Por aqui.
std::vector<int> a(100, 10);
std::vector<int> b = a;
for(unsigned int i = 0; i < b.size(); i++)
{
std::cout << b[i] << ' ';
}
Apesar de termos dado valores vectoriais a, o vetor b tem os valores. É a magia dos ...