вычет ссылочного шаблона - PullRequest
4 голосов
/ 13 января 2012
template<class U>
void f( U && v)
{     
    std::cout << typeid(v).name() << "\n"; //'int' in both cases

    if( boost::is_same<int&&,U>::value )
    {
        std::cout << "reach here\n"; //only with f<int&&>(int(1));
    }
}


int main()
{    
    f(int(1));

    f<int&&>(int(1));

    std::cin.ignore();
}

Почему параметр v интерпретируется как int, когда я явно не использую f<int&&>? В чем разница ? (Составлено с MVS2010)

Я предполагаю, что First передается как rvalue, а second как ссылка rvalue, и оба правильно связаны в ссылку rvalue, я прав?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 13 января 2012

Нет, не совсем. Ссылка на значение никогда не выводится. Понятие U&&, где U является выводимым параметром шаблона, используется для указания того, что U должно быть выведено таким образом, чтобы сохранить значение аргумента:

  • при передаче значения типа X тип U становится X.
  • при передаче cv квалифицированного lvalue типа X, тогда U становится типом X cv&.

Более интересным вопросом является то, что произошло с ссылками на rvalue, явно указанными во втором вызове, потому что не происходит никакого вывода, потому что в этом случае две ссылки на rvalue свернуты в одну.

1 голос
/ 13 января 2012

Первый вариант

f(int(1)) <=> f<int>(int(1)) <=> U==int <=> is_same<int&&,int> == false

Второй вариант

f<int&&>(int(1)) <=> U==int&& is_same<int&&,int&&> == true

Как это

...