2014-12-08 8 views
9

Na przykładCo T & redznacza dla jakiegoś argumentu szablonu T?

template<class T> 
struct Ref 
{ 
    using type = T&; 
}; 

Czy Ref<T>::type taka sama jak std::add_lvalue_reference<T>::type dla wszystkich możliwych argumentów szablonu? Na przykład. int, int& i int&&?

Właśnie przeczytałem kod źródłowy dla std::add_lvalue_reference<T>. Całkiem pewne, że są one równoważne.
Jeśli tak, możemy zaoszczędzić trochę miejsca, pisząc po prostu T&.

+0

@cdhowie Wow, nawet nie wiedział o tym pytaniu. Odpowiedzi wydają się nieco podobne ... – Columbo

Odpowiedz

6

Tabela 53 w [meta.trans.ref] - określenie add_lvalue_reference:

If T nazwy typ obiektu lub Następnie funkcja rodzaju element typedef wyznacza T&; w przeciwnym razie, jeśli T nazywa "wartość rvalue reference to T1", wówczas typ typu typedef będzie oznaczać T1&; w przeciwnym razie wpisz będzie oznaczać T.

teraz przypomnieć zasady zwijania Numer referencyjny:

Jeśli [...] typ szablonu parametr (14.3.1) [...] oznacza typ TR że jest odniesienie do wpisz T, próbą stworzenia typu „lwartość odniesienie do cvTR” tworzy rodzaj „lwartości odniesieniu do T [...]

Więc odpowiedź brzmi tak:

  • Dla obiektów lub funkcji warunek jest trywialnie spełnione. Jest to po prostu T&, bez udziału zwijania referencji.

  • W przypadku referencji rvalue tworzona jest referencja l do typu określonego, T1.

  • Dla referencji l-wartościowy zachowany jest dokładny typ odniesienia.

Powiązane problemy