在哪种情况下std :: unique_ptr :: operator []会抛出?

时间:2016-03-28 22:40:42

标签: c++ c++11 language-lawyer unique-ptr noexcept

我的班级有一个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函数调用它是否安全?

2 个答案:

答案 0 :(得分:1)

我以为我试一试(我不确定答案)。

我浏览了noexcept reference,我的理解是noexcept只是表明函数应该不会抛出异常,因此编译器可以进行更积极的优化。 至于为什么unique_ptr::operator[]不是noexcept猜测,标准化的那个想象一些实现者可能会抛出而另一些可能没有。 我的观点是unique_ptr::operator[]可能会根据unique_ptr的实现而抛出(通常在索引超出范围时)。 但是,根据您的代码的上下文,您可以确保这不会发生,并决定为您的运营商[]指定noexcept

答案 1 :(得分:1)

  

所以,长话短说,有没有任何可能的unique_ptr :: operator []抛出

是。它只会在它具有的指针类型上使用[]。这可能会引发。回想一下,由于删除体操,指针类型不一定是实际的指针。它可能是一个用户定义的对象类型,它有自己的operator[]重载,可能会超出使用范围。