【问题标题】:Bind an lvalue reference to an rvalue reference?将左值引用绑定到右值引用?
【发布时间】:2014-10-31 13:59:33
【问题描述】:

我已经尝试编译了:

int &&a=3;
int &b=a;

而且它有效。 我知道“a”是一个左值,但为什么我可以将“对 int 的右值引用”绑定到“对 int 的左值引用(而不是对 int 的右值引用)”? 这样,我可以更改临时值 3:

b=5 //changing the value of the temporary bound to the rvalue reference

这个技术是从 std::forward 使用的,所以我认为这是一种标准行为。 对 int 的右值引用是否被视为存储临时值的简单 int 左值? 如果不是,你如何解释绑定?

【问题讨论】:

    标签: c++ reference forward lvalue rvalue


    【解决方案1】:

    引用不绑定到其他引用;它们绑定到对象。

    当您从3 初始化a 时,您将创建一个新的临时int 对象whose lifetime is extendedb 只是对该对象的另一个引用。

    注意a 一个左值,因为它是一个命名对象的表达式,即使它有 type "rvalue-reference to int"!注意不要将 typesvalue categories 混淆,这里:types 与对象相关,但 value categories 与 expressions 相关(即使这些表达式名称或以其他方式评估某个对象)。

    仔细想想,这些令人困惑的规则都非常巧妙地结合在一起:要使原始引用有效,对象的生命周期必须已延长,因此b 的初始化是安全的。

    【讨论】:

    • 但是,我知道只有 const 左值引用可以绑定到临时值。如果延长其生命周期,是否有任何规则可以让普通的左值引用绑定到临时对象?
    • @Toccio:这不是真的。只有 const 左值引用(和右值引用)可以绑定到通过右值表达式访问的对象。但是a 是一个左值表达式,因为它引用了一个对象的name。引用引用的对象是临时对象并不重要。
    • 还有一个问题:当我将左值引用 A 绑定到另一个引用 C 的左值引用 B 时,我真正要做的是将 A 绑定到 C 对吗?那么,如果 B 是一个右值引用,而 C 是一个临时的,是不是就像我将 A 绑定到 C 一样?
    • @Toccio:嗯,我猜是这样;你的问题不太清楚。
    • 嗯,试试这个方法:一个 int& 可以绑定到一个 int 左值,到 int& 和 int&& 是左值(如第一篇文章中的示例)。改变一个int&的值就像改变它所引用的对象的值一样。调用这个对象O,如果O又是一个引用(rvalue或lvalue都无所谓),那么对O的改变就会反过来, 对 O 引用的对象进行更改,依此类推,直到达到非引用类型。这一切都对吗?
    猜你喜欢
    • 2017-12-06
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    相关资源
    最近更新 更多