2013-03-17 16 views
8

Jak możemy przypisać wartość do elementu zapakowanego przez std::reference_wrapper?Przypisywanie wartości do std :: reference_wrapper

int a[] = {0, 1, 2, 3, 4}; 

std::vector <std::reference_wrapper<int>> v(a, a+5); 

v[0] = 1234; // Error, can not assign value ! 

Accoring błędu, bezpośrednie przypisanie zostanie usunięty:

error: use of deleted function 'std::reference_wrapper<_Tp>::reference_wrapper(_Tp&&) [with _Tp = int]'

Odpowiedz

11

Użyj funkcji get() użytkownika:

v[0].get() = 1111; // ok 

Here znajduje się lista wszystkich funkcji członkowskich std::reference_wrapper. Ponieważ nie jestoperator=:

reference_wrapper& operator=(const reference_wrapper<T>& other); 

int dosłowny jest konwertowany do owinięcia referencyjnej, która kończy się niepowodzeniem i jest komunikat o błędzie widzisz.

Alternatywnie można wywołać operatora konwersji jawnie (static_cast<int&>(v[0]) = 1111;), ale lepiej użyć metody get(), jak pokazano powyżej.

+1

Zastanawiasz się, jaki jest pożytek operatora konwersji, jeśli nie można go użyć w ten sposób? Znajduję 'static_cast (v [0]) = 1111;' trochę głupie, gdy 'get()' jest. – chris

+0

Może dodać, że nie jawny konstruktor 'std :: reference_wrapper' jest tutaj ważny, np. 'boost :: reference_wrapper' nie ma. – inf

+2

@chris, możesz przekazać 'reference_wrapper ' do funkcji przyjmującej 'T &' (możesz też nazwać 'get()', jak sądzę, ale byłoby to po prostu bardziej szczegółowe). –

Powiązane problemy