代码之家  ›  专栏  ›  技术社区  ›  RiaD

在现代C++中,临时生命延长是什么时候有用的?

  •  6
  • RiaD  · 技术社区  · 8 年前

    在C++中,可以将函数的返回值(返回值,而不是引用)绑定到const引用,而代码仍然有效,因为这个临时的生存期将被延长到作用域的结束。例如

    std::string get_string() {
        return "abc";
    }
    
    
    void f() {
        const std::string& str = get_string();
        std::cout << str; // valid, str is not dangling reference.
    }
    

    我的问题是,它什么时候有用,比如代码什么时候有用

    A get_a();
    const A& a = get_a();
    

    比密码好

    A get_a();
    A a = get_a();
    

    以什么方式(例如更快、更小的二进制大小等)?应该实现什么 A , get_a 打电话后编码 盖特加 ?

    我亲手测试了几个案例,每一个案例的拷贝数和移动数都是一样的。

    让我们把这个问题限制在当前的C++标准中,编译器和构建的现代版本都启用了优化(O2、O3或其他编译器的等价物)。

    1 回复  |  直到 8 年前
        1
  •  6
  •   Nicol Bolas    8 年前

    如果您确切地知道发生了什么,那么将prvalues故意扩展到指定的堆栈变量中是没有用的。也就是说如果你 不知道 到底是怎么回事。

    比如说,你在一个模板函数中。用户应该给你一些对象 get 返回符合某些预期行为的类型的成员函数。问题:是否 得到 返回引用或prvalue?

    回答: 你不在乎 . 它返回prvalue或引用并不重要;重要的是它返回的内容可以按照您期望的方式进行操作。所以你可能会想到 obj.get() = 10; 例如,工作。

    也许吧 得到 返回对对象的引用。或者它返回的prvalue是一个代理对象 行为 就像一个参考。在上面的例子中,也许它有一个 operator= 重载,以便可以分配给它。你这个用户不在乎。

    所以,如果你想储存 得到 短期内返回?好吧,你不想这么做 auto x = obj.get(); ;如果它返回了一个实际的引用,您将得到一个引用的副本,这可能不是您想要的。你也是 auto &&x = obj.get(); . lifetime扩展允许这在代理prvalue对象和实际引用中同样有效。