【发布时间】:2014-08-21 20:02:49
【问题描述】:
我用 C++ 编写代码,它使用 std::unique_ptr u 来处理 std::string 资源,我想取消引用 u 以便可以将 std::string 传递给 std::string 复制构造函数的调用:
std::string* copy = new std::string( /*dereference u here*/ );
我知道new 或std::string 复制构造函数可能会抛出,但这不是我的意思。我只是想知道取消引用u 是否已经引发异常。我觉得奇怪的是operator*没有标记为noexcept,而std::unique_ptr 方法get 实际上标记为noexcept。换句话说:
*( u.get() )
整体是noexcept
*u
不是。这是标准的缺陷吗?我不明白为什么会有不同。有什么想法吗?
【问题讨论】:
-
*(u.get())noexcept怎么样?u.get()不能返回nullptr吗? -
@BartoszKP 返回的
nullptr与noexcept有什么关系? -
@BartoszKP:嗯,cplusplus.com 上的引用说 get 是 noexcept ...据我所知,取消引用 nullptr 不会引发异常。无论如何,我在尝试取消引用之前检查 if( u )。
-
@Slava 是的,你是对的。我的意思是
operator*可以验证您是否正在取消引用空指针,如果是则抛出,而get()不应该这样做。但这仍然没有意义,因为operator->是noexcept... -
cppreference.com 说
operator*可能会抛出,让我们看看标准怎么说
标签: c++ c++11 unique-ptr