我用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
ISN'吨。这是标准中的缺陷吗?我不明白为什么会有区别。有什么想法吗?
答案 0 :(得分:9)
unique_ptr::operator*()
可能涉及对operator*()
中存储的类型的unique_ptr
重载调用。请注意,存储在unique_ptr
中的类型不必是裸指针,您可以通过嵌套类型D::pointer
更改类型,其中D
是unique_ptr
的类型删除。这就是函数不是noexcept
。
此警告不适用于您的使用案例,因为您在std::string *
中存储unique_ptr
而不是某种重载operator*
的类型。所以电话有效noexcept
给你。