Может кто-то помочь мне понять, почему выход следующего кодаТип вычет при использовании универсальных ссылки
template< typename T >
void check()
{
std::cout << "unknow type" << std::endl;
}
template<>
void check<int>()
{
std::cout << "int" << std::endl;
}
template<>
void check<int&>()
{
std::cout << "int&" << std::endl;
}
template<>
void check<int&&>()
{
std::cout << "int&&" << std::endl;
}
template< typename T >
void bar(T&& a)
{
check<T>();
}
int main()
{
bar(0);
int a = 0;
bar(a);
}
является
int
int&
и не
int&&
int&
С моей точки view, кажется более интуитивным, что ссылка r-value остается в качестве ссылки на r-значение и ссылкой l-value lv alue reference. Однако кажется, что только ссылки l-value остаются в качестве ссылок на l-значение, а значения r становятся неосновными. Какова мотивация/идея этого?
Вы используете 'check', а не 'check '; Почему вы ожидаете, что' && 'будет там, когда вы явно опустите его? –
ildjarn
Я ожидал, что 'bar (0)' будет таким же, как 'bar (0)'. При замене в моем коде выше 'bar (0)' на 'bar (0)', тогда вывод фактически является 'int && \ n int &'. –
Тип 'bar' is 'void (T &&)', тип 'bar ' is 'void (T && &&)' (перед свертыванием ссылки). –
Oktalist