常量参考延长对象的寿命,然后是const_cast,这是一个好主意吗?

Const reference to extend object's life followed by const_cast, is it a good idea?

本文关键字:好主意 一个 cast const 对象 参考 常量 然后      更新时间:2023-10-16

考虑以下返回大对象的函数:

std::list<SomethingBig> DoSomething()
{
    std::list<SomethingBig> TheList;
    //do stuff
    return TheList;
}

我想得到列表,而不是它的副本。因为如果我必须复制这样的对象,性能价格是昂贵的。我知道返回值优化可能会为我解决这个问题,但依靠优化来优化坏代码并不是最好的方法(对吧?

避免复制和延长对象寿命的一种干净方法是使用常量引用(请在称其为悬空引用之前对其进行测试,因为它不是(:

const std::list<SomethingBig>& theList = DoSomething();

在C++11中,可以使用std::move来避免复制。但是,我正在开发一个 C++03 程序,我必须这样做:

const std::list<SomethingBig>& list1 = DoSomething();
const std::list<SomethingBig>& list2 = DoSomethingElse();

现在我需要将列表拼接在一起。我唯一的方法是复制所有内容,或者const_cast这些列表并拼接它们。有没有更好的解决方案?

只需按值返回它,由于 NRVO,它会比引用和std::move更好,这不是"对坏代码的优化",而是一种使好代码快速工作的方法。

据我所知,NRVO 确实不能保证发生(与 RVO 相反,RVO 自 c++17 以来是必须的(,但编译器极不可能不在此处删除副本

无论如何,依靠复制省略比使用const_cast技巧要安全得多,而且比移动便宜。

叮当和 gcc 都用-std=c++03 -O0来省略副本

DoSomething...()的界面更改为std::list<SomethingBig> & DoSomething(std::list<SomethingBig> &)怎么样?列表对象的生存期将在 DoSomething()DoSomethingElse() 之外进行控制。例如:

std::list<SomethingBig> list;
DoSomethingElse(DoSomething(list));