Рассмотрим этот код:C++ 11 идеально экспедиторская и ссылка рушится
template<typename T>
void foo(T&& param){ //In this case && is called universal reference
std:string tmp = std::forward<string>(param);
}
Мой вопрос, если универсальный ссылочный тип может быть выведен почему мне еще нужно позвонить вперед?
Почему без пересылки правильный c'tor tmp не будет вызываться, даже если был выведен тип T.
Мой второй вопрос о референтных рушится правил:
A& &&
становитсяA&
A&& &&
становитсяA&&
так, согласно правилам и это принимая во внимание универсальную ссылку, почему станд :: вперед подпись не может быть следующим:
template<class T>
T&& forward(T&& arg){
return static_cast<T&&>(arg);
}
Согласно правилам выше, если тип T
имеет значение rvalue, он будет сбрасываться до ссылки rvalue, если тип T - это значение lvalue, оно будет сбрасываться до ссылки lvalue.
Итак, почему у std::forward
есть две разные подписи, одна для ссылки lvalue и одна для ссылки rvalue. Я что-то упускаю?
В наши дни они называются «пересылкой ссылок». –
Что такое T $$? это должно быть T &&? – UpAndAdam