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

mec*_*ahi 2 c++

想象一下,我们有一堂课

class cFoo {};
Run Code Online (Sandbox Code Playgroud)

另一个带有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
            ??????????
    };
Run Code Online (Sandbox Code Playgroud)

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

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

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

Dra*_*rax 10

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

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

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

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


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

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

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