无法将 'int&' 类型的非常量左值引用绑定到 'int' 类型的右值
cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int'
以下代码无法编译:
#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));
~~~~^~~~~~~~~~~~~~~~~~~~
我不确定为什么编译器试图将非常量左值引用绑定到右值。前向无论如何都应该衰减为左值引用,对吗?
问题与转发无关
在调用 add2T(x)
中,推导的模板参数 T
是 int&
。 (只有这样,T&&
才能成为左值引用类型。)因此return类型也是int&
。但是,return
的操作数(即add2(std::forward<T>(x))
)是一个右值,不能用来初始化int&
。因此出现错误消息。
如果要防止return类型成为引用类型,可以申请std::decay_t
:
template <typename T>
std::decay_t<T> add2T(T&& x)
以下代码无法编译:
#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));
~~~~^~~~~~~~~~~~~~~~~~~~
我不确定为什么编译器试图将非常量左值引用绑定到右值。前向无论如何都应该衰减为左值引用,对吗?
问题与转发无关
在调用 add2T(x)
中,推导的模板参数 T
是 int&
。 (只有这样,T&&
才能成为左值引用类型。)因此return类型也是int&
。但是,return
的操作数(即add2(std::forward<T>(x))
)是一个右值,不能用来初始化int&
。因此出现错误消息。
如果要防止return类型成为引用类型,可以申请std::decay_t
:
template <typename T>
std::decay_t<T> add2T(T&& x)