c++ - 通过引用返回一个 unique_ptr

标签 c++ c++11

所以我已经解决了这个问题,但如果我所做的是最佳实践,我需要你的意见。

一个简单的类包含 unique_ptrs 的 vector 订购元素。我会解释成员变量null_unique以下。

class order_collection {
    typedef std::unique_ptr<order> ord_ptr;
    typedef std::vector<ord_ptr> ord_ptr_vec;
    ord_ptr_vec orders;
    ord_ptr null_unique;
public:
    ...
    const ord_ptr & find_order(std::string);
    ....

所以我需要这个类的用户来访问订单unique_ptr如果找到。但是我不会将对象移出 vector ,所以我要返回 unique_ptr作为常量引用。我执行的 find_order方法:

const order_collection::ord_ptr & order_collection::find_order(std::string id) {
    auto it = std::find_if(orders.begin(),orders.end(),
                           [&](const order_collection::ord_ptr & sptr) {
                               return sptr->getId() == id;
                           });

    if (it == orders.end())
        return null_unique; // can't return nullptr here
    return *it;
}

由于我是通过引用返回的,所以我不能返回 nullptr。如果我尝试这样做,我会得到 warning : returning reference to a temporary .如果什么也没找到,程序就会崩溃。所以我加了一个 unique_ptr<order>名为 null_unique 的成员变量当 find 找不到订单时,我会返回。这解决了问题并且警告消失并且在找不到订单时不会崩溃。

但是我怀疑我的解决方案,因为它让我的类(class)变得丑陋。这是处理这种情况的最佳做法吗?

最佳答案

只有在您关心智能指针的所有权语义时,您才应该返回并接受智能指针。如果您只关心它们指向的内容,则应该返回一个引用 或一个原始指针

由于您要返回一个虚拟的 null_unique,很明显该方法的调用者不关心所有权语义。您还可以有一个空状态:因此您应该返回一个原始指针:

order* order_collection::find_order(std::string id) {
    auto it = std::find_if(orders.begin(),orders.end(),
                           [&](const order_collection::ord_ptr & sptr) {
                               return sptr->getId() == id;
                           });

    if (it == orders.end())
        return nullptr;
    return it->get();
}

关于c++ - 通过引用返回一个 unique_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43400850/

相关文章:

c++ - 使用 std::array 并使用 "array"作为名称

c++ - 扭曲的二项式系数

c++将隐式转换从double更改为int

c++ - move_iterator 对于返回纯右值的迭代器被破坏并返回悬空引用

C++11 async 只使用一个核心

c++ - 关于常量表达式的困惑

c++ - 通过非常量引用将使用自动关键字声明的 lambda 作为参数传递给 std::function 参数类型

c++ - 循环 typedef 列表

c++ - std::atomic_compare_exchange_* 等如何与任意指针一起使用?

c++ - 合并 IplImage 和 cv::Mat 的设计决定是什么?