Nik*_* C. 7 c++ unique-ptr language-lawyer noexcept c++11
我有一个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_;
};
Run Code Online (Sandbox Code Playgroud)
我已将运营商标记为noexcept.然而,unique_ptr::operator[]是不是 noexcept.我无法找出原因,以及我是否可以假设它永远不会抛出.unique_ptr::operator[]本身没有列出文档中的任何异常(cppreference和MSDN声称它没有定义它可能抛出的任何异常列表.)
所以我假设缺失noexcept可能是:a)错误,或b)运算符访问的基础数据类型可能抛出.选项a会很好,因为这意味着我可以标记自己的运算符noexcept.选项b很难理解,因为所有操作员都会获得参考,并且它不会调用任何东西.
所以,长话短说,是否有任何unique_ptr::operator[]抛出的可能性,从noexcept函数中调用它是否安全?
那么,长话短说, unique_ptr::operator[] 是否有可能抛出异常
是的。它将简单地使用[]它所具有的指针类型。那可能会抛出。回想一下,由于删除器体操,指针类型不必是实际的指针。它可能是用户定义的对象类型,具有自己的operator[]重载,可能会引发越界使用。