Все могут знать, что мы используем rvalue-ссылки в сочетании с правилами свертывания ссылок для создания идеальных функций пересылки, например так
template<typename T>
void f(T&& arg) {
otherfunc(std::forward<T>(arg));
}
f(4);
Правила свертывания ссылок похожи на
+------+-----+--------+
| T | Use | Result |
|------|--------------|
| X& | T& | X& |
| X& | T&& | X& |
| X&& | T& | X& |
| X&& | T&& | X&& |
+------+-----+--------+
Итак, в моем примере f
, T
— это int&&
, а T&&
— это int&& &&
, которое сворачивается в int&&
.
Мой вопрос: зачем нам эти правила, если T
уже выведено в int&&
? Почему будет
template<typename T>
void f(T arg);
f(4);
превратиться в void f(int)
вместо void f(int&&)
, если T
будет int&&
? Если T
на самом деле int
, а T&&
- это то, что превращает его в int&&
и, следовательно, void f(int&&)
, то зачем нам нужны правила свертывания ссылок, если кажется, что они никогда не применяются? Это единственные два варианта, которые я могу сказать из своих ограниченных знаний, поэтому, очевидно, есть правило, о котором я не знаю.
Также было бы полезно увидеть цитату из стандарта по этому поводу.
T
иногда используется какint
, а иногда какint&&
, и когда это так, я могу предсказать поведение своего кода. - person Kal   schedule 05.10.2013