不能绑定'int&'类型的非const左值引用到'int'类型的右值

时间:2017-12-01 17:14:49

标签: c++ perfect-forwarding

以下代码无法编译:

#include <iostream>

using namespace std;

int add2(const int& x)
{
    return x + 2;
}

template <typename T>
T add2T(T&& x) {
    return add2(std::forward<T>(x));
}

int main(int argc, char** argv) {
    int x = 0;

    cout << "Add 2" << endl;

    cout << add2(2) << endl;
    cout << add2(x) << endl;

    cout << "Add 2T" << endl;

    cout << add2T(10) << endl; 
    cout << add2T(x) << endl;

    return 0;
}

有了这条消息:

main.cpp: In instantiation of 'T add2T(T&&) [with T = int&]':
main.cpp:26:20:   required from here
main.cpp:12:16: error: cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int'
     return add2(std::forward<T>(x));
            ~~~~^~~~~~~~~~~~~~~~~~~~

我不确定为什么编译器试图将非const左值引用绑定到rvalue。无论如何,前锋应该衰减为左值参考,对吗?

1 个答案:

答案 0 :(得分:7)

问题与前进无关。

在致电add2T(x)中,推断的模板参数Tint&。 (只有这样,T&&才能成为左值引用类型。)因此返回类型也是int&。但是,return(即add2(std::forward<T>(x)))的操作数是一个不能用于初始化int&的右值。因此错误信息。

如果您想阻止返回类型成为引用类型,可以应用std::decay_t

template <typename T>
std::decay_t<T> add2T(T&& x)