std :: unique_ptr的“无法解除引用”

时间:2014-08-21 20:02:50

标签: c++ c++11 unique-ptr

我用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* 标记为noexceptstd::unique_ptr方法get实际上标记为noexcept时,我觉得很奇怪。换句话说:

*( u.get() )

noexcept整体而

*u

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

1 个答案:

答案 0 :(得分:9)

unique_ptr::operator*()可能涉及对operator*()中存储的类型的unique_ptr重载调用。请注意,存储在unique_ptr中的类型不必是裸指针,您可以通过嵌套类型D::pointer更改类型,其中Dunique_ptr的类型删除。这就是函数不是noexcept

的原因

此警告不适用于您的使用案例,因为您在std::string *中存储unique_ptr而不是某种重载operator*的类型。所以电话有效noexcept给你。