我的班级有一个operator[]
,它所做的只是在std::unique_ptr::operator[]
成员上拨打unique_ptr
。相关部分就是这样:
template <typename T> struct Foo {
T& operator [](const size_t pos) const noexcept
{
return data_[pos];
}
std::unique_ptr<T[]> data_;
};
我已将运营商标记为noexcept
。但是,unique_ptr::operator[]
不是 noexcept
。我无法找出原因,以及我是否可以假设它永远不会抛出。 unique_ptr::operator[]
本身没有列出文档中的任何异常(cppreference和MSDN声称它没有定义它可能抛出的任何异常列表。)
所以我假设缺少noexcept
可能是:a)错误,或b)运算符访问的基础数据类型可能抛出。选项a会很好,因为这意味着我可以标记自己的运算符noexcept
。选项b很难理解,因为所有操作员都会获得参考,并且它不会调用任何东西。
所以,长话短说,是否有unique_ptr::operator[]
投掷的可能性,从noexcept
函数调用它是否安全?
答案 0 :(得分:1)
我以为我试一试(我不确定答案)。
我浏览了noexcept reference,我的理解是noexcept
只是表明函数应该不会抛出异常,因此编译器可以进行更积极的优化。
至于为什么unique_ptr::operator[]
不是noexcept
我猜测,标准化的那个想象一些实现者可能会抛出而另一些可能没有。
我的观点是unique_ptr::operator[]
可能会根据unique_ptr
的实现而抛出(通常在索引超出范围时)。
但是,根据您的代码的上下文,您可以确保这不会发生,并决定为您的运营商[]指定noexcept
。
答案 1 :(得分:1)
所以,长话短说,有没有任何可能的unique_ptr :: operator []抛出
是。它只会在它具有的指针类型上使用[]
。这可能会引发。回想一下,由于删除体操,指针类型不一定是实际的指针。它可能是一个用户定义的对象类型,它有自己的operator[]
重载,可能会超出使用范围。