C++中的模板引用参数推导失败

msc*_*msc 10 c++ templates const c++14

为什么以下代码无法在C++ 14编译器中编译?如果我使用

const int i = 10;
int n = fun(i);
Run Code Online (Sandbox Code Playgroud)

编译器出错.

但是,如果我使用

int n = fun(10);
Run Code Online (Sandbox Code Playgroud)

而不是上述陈述,它工作正常.

例:

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
}
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 17

它失败,因为添加const会阻止它成为转发引用.它成为const rvalue的常规引用:

[temp.deduct.call/3]

...转发引用是对cv-unqualified 模板参数的rvalue引用,该参数不表示类模板的模板参数(在类模板参数推导期间[[over.match.class.deduct]))....

然后你传递一个左值.它没能通过比赛.