[英]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.