7

我试图了解左值如何绑定到右值引用。考虑这段代码:

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

4

2 回答 2

7

由于T是模板参数,因此T&&成为forwarding-reference。由于引用折叠规则,f(T& &&)变为左值f(T&)f(T &&)变为f(T&&)右值。

于 2013-06-15T18:11:03.950 回答
1

0x499602D2 已经回答了你的问题;但是,对您的代码进行以下更改可能会提供进一步的见解。

我添加了一个static_asserttof来检查推导的类型:

#include <type_traits>

template<typename T>
void f(T&& x) {
    static_assert(std::is_same<T&&, int&>::value,"");
    std::cout << x;
}

断言不会失败,因此xin的类型f最终是int&(在此特定示例中)。

我改变了g调用方式main

g(std::move(x));

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

希望这有助于理解右值引用。

于 2013-06-15T19:31:49.817 回答