[英]lvalue binding to rvalue reference
我试图了解左值如何绑定到右值引用。 考虑以下代码:
#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()的调用却给出了编译时错误。 这种绑定仅适用于模板吗? 为什么? 没有模板,我们能以某种方式做到吗?
由于T
是模板参数,因此T&&
成为转发引用 。 由于参考塌陷规则, f(T& &&)
变为f(T&)
为左值和f(T &&)
变为f(T&&)
为右值。
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;
}
断言不会失败,所以类型x
在f
是最终int&
在此特定示例中)。
我已经更改了main
g
的调用方式:
g(std::move(x));
现在,代码已编译,程序按预期工作并打印44
。
希望这有助于理解右值引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.