我试图理解左值如何绑定到右值引用。请考虑以下代码:
#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()的调用会产生编译时错误。这种绑定是否仅适用于模板?为什么?我们可以在没有模板的情况下以某种方式做到吗?
答案 0 :(得分:6)
由于T
是模板参数,T&&
成为转发参考。由于参考折叠规则,对于左值,f(T& &&)
变为f(T&)
,对于右值,f(T &&)
变为f(T&&)
。
答案 1 :(得分:1)
0x499602D2已经回答了你的问题;尽管如此,您的代码的以下更改可能会提供进一步的见解。
我已将static_assert
添加到f
以检查推断的类型:
#include <type_traits>
template<typename T>
void f(T&& x) {
static_assert(std::is_same<T&&, int&>::value,"");
std::cout << x;
}
断言不失败,因此x
中f
的类型最终为int&
(在此特定示例中)。
我更改了g
中调用main
的方式:
g(std::move(x));
现在代码编译并且程序按预期工作并打印44
。
希望这有助于理解右值参考。