Подтвердить что ты не робот

Ошибка вывода ссылочного аргумента шаблона в С++

Почему следующий код не компилируется в компиляторе С++ 14? Если я использую

const int i = 10;
int n = fun(i);

Компилятор выдает сообщение об ошибке.

Но, если я использую

int n = fun(10);

вместо приведенных выше инструкций, он отлично работает.

Пример:

template<typename T>
int fun(const T&&)
{
    cout<<"fun"<<endl;
}

int main()
{
 // int i = 10;         // Not work
    const int i = 10;   // Not work
    int n = fun(i);  
 // int n = fun(10);    // Working fine
}
4b9b3361

Ответ 1

Он терпит неудачу, потому что добавление константы не позволяет ему пересылать ссылку. Он становится регулярной ссылкой на const rvalue:

[temp.deduct.call/3]

... Ссылка на пересылку представляет собой ссылку rvalue на cv-unqualifiedпараметр шаблона, который не является параметром шаблона шаблон класса (во время вывода аргумента шаблона шаблона ([Over.match.class.deduct]))....

И вы передадите ему lvalue. Это не соответствует.

Ответ 2

Это здесь

int fun(const T&&)

означает, что вам нужно указать в качестве параметра a rVal

так

const int i = 10;

не делает i кандидатом как rVal (потому что вы можете получить адрес i)