"No-throw dereferencing" 标准::unique_ptr

"No-throw dereferencing" of std::unique_ptr

本文关键字:ptr unique 标准 No-throw dereferencing      更新时间:2023-10-16

我在C++中编写代码,该代码使用std::unique_ptr u来处理std::string资源,并且我想取消引用u,以便我可以将std::string传递给std::string复制构造函数的调用:

std::string* copy = new std::string( /*dereference u here*/ );

我知道newstd::string复制构造函数可能会抛出,但这不是我在这里的重点。我只是想知道取消引用u是否已经会引发异常。我觉得奇怪的是,operator*没有被标记为noexcept,而std::unique_ptr方法get实际上被标记为noexcept。换句话说:

*( u.get() )

是作为一个整体noexcept

*u

不是。这是标准的缺陷吗?我不明白为什么会有区别。有什么想法吗?

unique_ptr::operator*()可能涉及调用存储在unique_ptr中的类型的operator*()重载。注意,存储在unique_ptr中的类型不一定是裸指针,你可以通过嵌套类型D::pointer来更改类型,其中Dunique_ptr的删除器的类型。这就是为什么该功能不noexcept的原因。

此警告不适用于您的用例,因为您将std::string *存储在unique_ptr中,而不是某种使operator*过载的类型。因此,该电话实际上为您noexcept