![](/img/trans.png)
[英]Why does std::unique_ptr operator* throw and operator-> does not throw?
[英]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
函數調用它是否安全?
我以為我可以嘗試一下(我不確定答案)。
我瀏覽了noexcept參考 ,我的理解是noexcept
只是表明該函數不應引發異常,以便編譯器可以進行更具攻擊性的優化。 至於為什么unique_ptr::operator[]
並非noexcept
我想一個標准化的人會想象一些實現者可能拋出而其他實現者可能不會拋出。 我的觀點是,取決於unique_ptr
的實現(通常在索引超出范圍時), unique_ptr::operator[]
可能會拋出unique_ptr
。 但是,根據代碼的上下文,您可以確保不會發生這種情況,並決定為operator []指定noexcept
。
因此,長話短說,unique_ptr :: operator []是否有可能拋出
是。 它將僅在其具有的指針類型上使用[]
。 那可能會拋出。 回想一下,由於進行了刪除程序體操,所以指針類型不必是實際的指針。 它可能是用戶定義的對象類型,帶有自己的operator[]
重載,可能會超出范圍使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.