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

时间:2017-08-02 12:28:33

标签: c++ templates const c++14

为什么以下代码不能在C ++ 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
}

2 个答案:

答案 0 :(得分:17)

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

[temp.deduct.call/3]

  

...转发参考是对 cv-unqualified 的右值引用   不代表a的模板参数的模板参数   类模板(在类模板参数推导期间   ([over.match.class.deduct]))。 ...

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

答案 1 :(得分:2)

这里

int fun(const T&&)

表示您需要将rVal

作为参数提供

所以

const int i = 10;

没有让i候选人成为rVal(因为你可以获得i的地址)