繁体   English   中英

C ++,从具有引用返回类型的函数返回什么以指示错误

[英]C++, What to return from a function with reference return type to indicate error

想象一下,我们有一堂课

class cFoo {};

另一个带有cFoo对象的向量,如下所示:

class cContainer
    {
        public:
            const cFoo& getFoo(std::size_t index) const;
        private:
            std::vector<cFoo> fooList_;
    }
    const fCoo& cContainer::getfoo(std::size_t index) const
    {
        if(index < fooList_.size())
            return fooList_[index];
        else
            ??????????
    };

所以我的问题是“在这种情况下最佳做法是什么?”。 这是在其他部分代替????之后放的东西。 此问题对于返回引用的任何成员函数(无论是否为const)都有效。 当我们没有任何东西可以返回时,应该返回什么?

显然返回一个本地临时变量是不可能的。 我想到的另一个解决方案是返回一个cFoo()的静态实例, cFoo()最有可能在cFoo类定义/实现期间定义和初始化。

当然,在这种情况下,我们可以避免返回引用,但它可能是性能差的选择(特别是如果我们缺少像move运算符这样的好东西)。

STL在这种情况下所做的是抛出异常。

例如,您可以查看std::vector::at成员函数:

http://en.cppreference.com/w/cpp/container/vector/at

如果你要求超出范围的东西,它会抛出std :: out_of_range异常


另一种选择是在此上下文中返回指针或其更具语义boost::optional<fCoo&>等价物, 可选引用 boost::optional<fCoo&>

如果“超出范围”的情况不是那么特殊并且应该不时发生,我建议采用这种方式。

最后,如果你认为这种情况永远不会发生,除非它是一个开发者错误,你应该使用一个断言

如果没有返回的东西对于函数是正常的,它不应该返回引用。 返回指针没有错:

const fCoo* cContainer::getfoo(std::size_t index) const
{
    if(index < fooList_.size())
        return fooList_[index];
    else
        return nullptr;
};

如果没有任何返回的东西表示该函数的异常 ,那么它应该抛出异常:

const fCoo* cContainer::getfoo(std::size_t index) const
{
    if(index < fooList_.size())
        return fooList_[index];
    else
        throw std::invalid_argument("out of range");
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM