utilização do impulso: ref para passar referência a funções que tomam valores

Estou confuso sobre o uso de impulso:: ref. Não percebo porque é que alguém quereria fazer o seguinte ...

void f(int x)
{
    cout << x<<endl;
    x++;
}

int main(int argc, char *argv[])
{
    int aaa=2;
    f(boost::ref(aaa));
    cout << aaa<<endl;
    exit(0);
}

Qual é a utilidade de passar um ref para uma função. Posso sempre passar pelo valor. Também não é que o árbitro seja realmente aprovado. No acima, o valor de aaa em geral permanece apenas 2.

Onde é que o boost ref é útil?

é possível usar impulso:: ref neste cenário. I want to pass iterator refernce to std:: sort function. normalmente a o sort funciona em cópias iterator - irá aumentar:: ref fazê-lo funcionar para referências também? (sem quaisquer alterações na DST::sort)

Author: Useless, 2013-05-09

2 answers

Não percebo porque é que alguém quereria fazer o seguinte.
Não é para isso que serve. Se uma função toma um argumento por valor, então não há maneira de forçá-la a tomá-lo por referência em vez disso.
Onde é que o boost ref é útil?

Pode ser usado para fazer uma função template agir como se tomasse um argumento por referência, instanciando o template para a referência (embalagem) tipo, em vez do tipo de valor:

template <typename T>
void f(T x) {++x;}

f(aaa);      cout << aaa << endl; // increments a copy: prints 0
f(ref(aaa)); cout << aaa << endl; // increments "a" itself: prints 1

Um uso específico comum é para argumentos de ligação às funções:

void f(int & x) {++x;}

int aaa = 0;
auto byval = bind(f, aaa);      // binds a copy
auto byref = bind(f, ref(aaa)); // binds a reference

byval(); cout << aaa << endl;   // increments a copy: prints 0
byref(); cout << aaa << endl;   // increments "a" itself: prints 1

É possível usar impulso:; ref neste cenário. I want to pass iterator refernce to std:: sort function. normalmente o sort funciona em cópias iterator - irá aumentar:: ref fazê-lo funcionar para referências também?

Não; o invólucro de referência não satisfaz os requisitos do iterador, por isso não pode usá-lo em algoritmos padrão. Se pudesses, então ... muitos algoritmos iriam horrivelmente mal se eles precisassem fazer cópias independentes de iteradores (como muitos, incluindo a maioria das implementações sort, devem fazer).

 12
Author: Mike Seymour, 2013-05-09 12:08:21
Leste a documentação? Diz:

A Biblioteca Ref é uma pequena biblioteca que é útil para passar referências a Modelos de funções (algoritmos) que usualmente tirariam cópias de seus argumentos.

No seu primeiro exemplo, void f(int) não é um modelo de função, por isso não há efeito: um Anonymous temporary boost::reference_wrapper<int> é criado e imediatamente convertido de volta para um int& que é então dizerferenciado para passar um int para a sua função. Esperemos que o compilador rejeite todo este disparate, uma vez que não tem qualquer efeito.

Dizes:

... Posso sempre passar pelo valor.

O que é verdade, mas eles fazem coisas diferentes. Passando pela referência:
  • evita uma cópia, o que provavelmente é inútil para os inteiros, mas é útil para objectos grandes ou caros para copiar
  • permite que o chamador veja o que a chamada função fez com o seu argumento. Não é provável que seja. útil para std::sort, mas em geral permitir parâmetros de entrada pode ser útil

It may allow std::sort to act on iterator references, avoiding a copy (although iterators are types barately-to-copy value types anyway), but I haven't tried it. Se achas que te vai ajudar nalguma coisa, porque não experimentas e vês?

 -1
Author: Useless, 2013-05-09 11:46:54