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?

Author: Philip Kirkbride, 2010-12-28

5 answers

Este é o código C++11. Em C++11, o token && pode ser usado para significar uma "referência rvalue".

 83
Author: aschepler, 2017-05-23 11:47:22

&& é 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.

 70
Author: Billy ONeal, 2013-03-04 07:40:11

&& é 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.
 53
Author: Lexseal Lin, 2017-08-08 11:55:55

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.
 27
Author: Michael Burr, 2014-11-30 00:11:58
Acho que é um operador de movimento. 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 ...

MSDN -- como criar um construtor de movimentos

 1
Author: yash101, 2014-12-23 16:43:12