左值绑定到右值参考

时间:2013-06-15 18:09:23

标签: c++ c++11 lvalue rvalue

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

#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()的调用会产生编译时错误。这种绑定是否仅适用于模板?为什么?我们可以在没有模板的情况下以某种方式做到吗?

2 个答案:

答案 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;
}

断言失败,因此xf的类型最终为int&(在此特定示例中)。

我更改了g中调用main的方式:

g(std::move(x));

现在代码编译并且程序按预期工作并打印44

希望这有助于理解右值参考。