【问题标题】:What is the purpose of using a reference to a reference in C++?在 C++ 中使用对引用的引用的目的是什么?
【发布时间】:2011-02-09 11:08:47
【问题描述】:

在我研究 boost 库的冒险中,我遇到了函数签名,这些函数签名具有对对象引用的引用。

例子:

void function(int && i);

这样做的目的/好处是什么,而不是简单地引用一个对象?我假设有一个,如果它在提升中。

【问题讨论】:

    标签: c++ c++11 pass-by-reference


    【解决方案1】:

    这不是对引用的引用;没有这样的东西。

    您看到的是 C++0x rvalue reference,用双 & 符号表示,&&。这意味着该函数的参数i 是临时的,因此允许该函数破坏其数据而不会导致调用代码出现问题。

    例子:

    void function(int &i);  // A
    void function(int &&i); // B
    int foo();
    
    int main() {
        int x = foo();
        function(x);     // calls A
        function(foo()); // calls B, because the return value is a temporary
    }
    

    这对于普通的ints 很少有用,但在定义移动构造函数时非常有用,例如。移动构造函数类似于复制构造函数,只是它可以安全地从原始对象中“窃取”内部数据,因为它是一个临时的,在移动构造函数返回后将不复存在。

    【讨论】:

    • 啊,好的。谢谢你的澄清。这段代码现在在 boost (1.42) 中如何?据我了解,boost 目前是为 C++03 标准编写的。
    • @Silver:它将利用某些编译器的功能。一些编译器支持 C++0x(有点),如果 Boost 想检测和使用它,它会的。
    • @SilverSun:Boost 使用条件编译(#if 等)来自定义每个编译器可用的内容。
    【解决方案2】:

    您正在查看的是右值引用。它是 C++0x 的一个新的核心语言特性。 请参阅 here 或不太正式的 here

    原提案可以在here找到

    【讨论】:

      【解决方案3】:

      这不是对引用的引用。它是一个右值引用,是即将到来的 C++0x 标准支持的新特性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-11
        • 2011-02-15
        • 2010-09-24
        • 1970-01-01
        • 2011-06-10
        • 2020-04-11
        • 2016-05-31
        • 2013-06-24
        相关资源
        最近更新 更多