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

时间:2015-03-20 09:26:45

标签: c++

想象一下,我们有一个班级

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静态实例。

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

2 个答案:

答案 0 :(得分:10)

在这种情况下STL的作用是抛出异常。

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

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

如果您要求超出范围的内容

,则会引发std::out_of_range异常

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

如果&#34;超出范围&#34;我会建议这样做。案件不是那么特殊,应该不时发生。

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

答案 1 :(得分:4)

如果函数没有返回是正常的,则不应该返回引用。返回指针没有错:

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");
};