2014-12-08 1 views
9

НапримерЧто такое T & mean для некоторого аргумента шаблона T?

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

Является Ref<T>::type же, как std::add_lvalue_reference<T>::type для всех возможных аргументов шаблона? Например. int, int&, и int&&?

Я только что прочитал исходный код для std::add_lvalue_reference<T>. Вполне уверены, что они эквивалентны.
Если это так, мы можем сэкономить место, просто набрав T&.

+0

@cdhowie Ничего себе, даже не знал об этом вопросе. Ответы кажутся несколько похожими ... – Columbo

ответ

6

Таблица 53 в [meta.trans.ref] - определение add_lvalue_reference:

If T имен объекта или функция тип, то тип член ЬурейеГо будет называть T&; в противном случае, если T называет тип «rvalue reference to T1», тогда тип typedef члена должен называть T1&; в противном случае, тип должен называть T.

Теперь вспомним правила эталонным складыванию:

Если [...] тип шаблона параметр (14.3.1) [...] обозначает тип TR, что является ссылкой к типа T, попытки создать тип «именующее ссылки на резюмеTR» создает тип «Lvalue ссылки на T» [...]

Так что ответ да:

  • Для объектов или функций условие тривиально выполнено. Это всего лишь T&.

  • Для ссылок rvalue создается ссылочная ссылка на тип, упомянутый, T1.

  • Для ссылок lvalue сохраняется точный ссылочный тип.