繁体   English   中英

左值绑定到右值引用

[英]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;
}

断言不会失败,所以类型xf是最终int&在此特定示例中)。

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

g(std::move(x));

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM