我试图理解左值是如何绑定到右值引用的。考虑下面的代码:
#include <iostream>
template<typename T>
void f(T&& x) {
std::cout << x;
}
void g(int&& x) {
std::cout << x;
}
int main() {
int x = 4;
f(x);
g(x);
return 0;
}虽然对f()的调用很好,但对g()的调用会产生编译时错误。这种绑定只对模板有效吗?为什么?我们可以在没有模板的情况下做到这一点吗?
发布于 2013-06-16 02:11:04
因为T是一个模板参数,所以T&&成为一个转发引用。由于引用折叠规则,对于左值,f(T& &&)变为f(T&),对于右值,f(T &&)变为f(T&&)。
发布于 2013-06-16 03:31:50
0x499602D2已经回答了您的问题;不过,对您的代码所做的以下更改可能会提供进一步的见解。
我已经向f添加了一个static_assert来检查推导出的类型:
#include <type_traits>
template<typename T>
void f(T&& x) {
static_assert(std::is_same<T&&, int&>::value,"");
std::cout << x;
}断言不会失败,因此f中的x类型最终为int& (在此特定示例中)。
我已经更改了在main中调用g的方式
g(std::move(x));现在,代码编译完成,程序按预期工作,并打印44。
希望这能对理解右值引用有所帮助。
https://stackoverflow.com/questions/17126485
复制相似问题