Я освежаю свою память о том, как совершенная переадресация работает в C++. Я понимаю, что вызов std::forward
вынужден предоставлять явный параметр шаблона по какой-то причине (т.е. при работе со ссылками rvalue, которые на самом деле являются lvalues), однако при проверке работоспособности фактического кода я был удивлен этим (несколько связанным) сценарий:
#include <iostream>
#include <utility>
#include <type_traits>
template<class T>
T&& fwd(T& t) {
return static_cast<T&&>(t);
}
template<class T>
T&& fwd(T&& t) {
return static_cast<T&&>(t);
}
int main()
{
int lnum = 3;
if (std::is_rvalue_reference<decltype(fwd(lnum))>::value)
std::cout << "It's rref." << std::endl; // this get's printed on screen
else
std::cout << "It's lref." << std::endl;
return 0;
}
Если я правильно понимаю свертывание ссылок (а я думаю, что понимаю), вывод типа должен быть таким:
int& && fwd(int& & t) {
return static_cast<int& &&>(t);
}
ведущий к
int& fwd(int& t) {
return static_cast<int&>(t);
}
Ясно, что это не так. Что мне здесь не хватает?
fwd(T& t)
, поэтомуT
этоint
, и в результате у вас естьint&&
.fwd(T&)
лучше подходит, чемfwd(T&&)
. Так что здесь нет места для ссылок. - person rafix07   schedule 28.10.2020