左值绑定到右值参考

r.v*_*r.v 6 c++ rvalue lvalue c++11

我试图理解左值如何绑定到右值引用.考虑以下代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

虽然对f()的调用很好,但是对g()的调用会产生编译时错误.这种绑定是否仅适用于模板?为什么?没有模板,我们能以某种方式做到吗?

0x4*_*2D2 6

由于T是模板参数,因此T&&成为转发引用.由于参考折叠规则,f(T& &&)变为左值f(T&)f(T &&)成为f(T&&)右值.