23

Argumentem tej funkcji będzie wiązać się z odniesieniem rvalue:Czy istnieje różnica między odniesieniami uniwersalnymi a referencjami przekazywania?

void f(int && i); 

Jednak argumentem tej funkcji będą wiązać się z obu rvalue lub lwartością odniesienia:

template <typename T> 
void f(T && t); 

ja często słyszałem, że jest to powszechne odniesienie.
Słyszałem też, że nazywa się to odniesieniem do przekazywania.
Czy mają na myśli to samo?
Czy jest to tylko odwołanie do przekazywania, jeśli treść funkcji wywołuje std::forward?

+1

Zobacz https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers dla niektórych materiałów podstawowych. –

+1

@SamVarshavchik Czy rzeczywiście przeczytałeś jedno z tych pytań lub tego bloga? – Barry

Odpowiedz

25

Czy mają na myśli to samo?

Universal reference było określenie Scott Meyers utworzono w celu opisania koncepcji przy odniesienie RValue parametrowi szablonu CV bez zastrzeżeń, która może być wyprowadzona albo jako wartości lub lwartością odniesienia.

W tym czasie standard C++ nie miał specjalnego terminu, co było niedopatrzeniem w C++ 11 i utrudnia nauczanie. Ten nadzoru została usunięta przez N4164, które dodaje się następującą definicję [temp.deduct]:

odniesienie przekazywanie jest odniesienie RValue parametrowi szablonu CV bez zastrzeżeń. Jeśli P jest odniesieniem do przekazywania, a argumentem jest l-wartość, zamiast "A" odejmowany jest typ "odniesienie do wartości l".

W związku z tym dwie oznaczają tę samą rzecz, a obecny standardowy termin C++ jest odniesieniem do przekazywania. Artykuł sam określa, dlaczego "odniesienie do przekazywania" jest lepszym terminem niż "odwołanie uniwersalne".

Czy jest to tylko odwołanie do przekazywania, jeśli treść funkcji wywołuje std::forward?

Nie, to, co robisz z odniesieniem do przekazywania, nie ma znaczenia dla nazwy. Odniesienie spedycja pojęcie odnosi się po prostu do tego, jak typ T jest wyprowadzany w:

template <class T> void foo(T&&); // <== 

To nie musi być następnie przekazane.

+1

Dobra odpowiedź! Czy masz jakiś (nie trywialny) przykład, w którym nie wywołasz 'std :: forward' na referencji przekazywania? Możesz także wspomnieć o przypadku 'auto &&' dla zmiennych lokalnych. – vsoftco

+1

@vsoftco 'template void foo (F && arg) {use (arg); use_again (arg); zużywają (std :: forward (arg)); } ' – Barry

+0

Nie wymaga wyjaśnień, dziękuję, chociaż wciąż kończysz naprzód :) – vsoftco

9

Niestety, jest to mylące, ale są one niczym więcej niż dwoma nazwami dla tego samego.
Uniwersalne odniesienie zostało zaproponowane (jak sądzę) przez Meyersa dawno temu (patrz here jako przykład).
Przesyłanie referencji jest odbierane bezpośrednio od standardese. To wszystko.