在什么情况下可能std::unique_ptr::operator[]抛出
Under which circumstances might std::unique_ptr::operator[] throw?
我的类有一个operator[]
,它所做的只是在unique_ptr
成员上调用std::unique_ptr::operator[]
。相关部分是这样的:
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
函数调用它是否安全?
长话短说,unique_ptr::operator[]是否有可能抛出
是的。它将简单地在它所具有的指针类型上使用[]
。这可能会让人失望。回想一下,多亏了deleter体操,指针类型不需要是实际的指针。它可以是一个用户定义的对象类型,具有自己的operator[]
重载,可以引发越界使用。
我想试试(我不确定答案)。
我浏览了noexcept引用,我的理解是noexcept
只是指示函数不应该抛出异常,这样编译器就可以进行更具攻击性的优化。至于为什么unique_ptr::operator[]
不是noexcept
,我猜标准化者认为一些实现者可能会抛出,而另一些实现者则可能不会。我的观点是,unique_ptr::operator[]
可能会抛出,这取决于unique_ptr
的实现(通常是在索引越界时)。但是,根据代码的上下文,您可以确保不会发生这种情况,并决定为运算符[]指定noexcept
。
- 为什么 std::optional::operator=(U&&) 要求你是非标量类型?
- CLANG 编译器 说:变量"PTR"可能未初始化
- 'operator='已弃用:改用 QDir::setPath()
- 过载'operator new'如何导致无限循环?
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 与'operator='不匹配(操作数类型'String'且"void")
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 处理"no operator found"
- 如何编写 operator= 用于使用虚拟方法与非平凡成员的匿名联合
- 运算符重载:"operator+"必须采用零个或一个参数
- 使用 operator() 扩展 Eigen::EigenBase
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 错误消息:使用"string* +="后"no match for 'operator+='"
- 有没有办法修改'operator->',以便'z->im'返回复数的虚部
- 如何将派生类从基 ptr 分配给 nlohmann::json
- "operator +="行为异常的定义
- 为什么 gcc 4.9.0 中没有定义"void operator delete(void* ptr, std::size_t size) noexcept;"?