&引用;“无抛出解引用”;std::唯一的 我在C++中编写代码,使用 STD::UngQuyPtU/Ung>处理一个 STD::String < /Case>资源,我想取消引用 u>代码>,以便我可以通过 STD::String 到 STD::String < /Cord>复制构造器:< /P> std::string* copy = new std::string( /*dereference u here*/ );

&引用;“无抛出解引用”;std::唯一的 我在C++中编写代码,使用 STD::UngQuyPtU/Ung>处理一个 STD::String < /Case>资源,我想取消引用 u>代码>,以便我可以通过 STD::String 到 STD::String < /Cord>复制构造器:< /P> std::string* copy = new std::string( /*dereference u here*/ );,c++,c++11,unique-ptr,C++,C++11,Unique Ptr,我知道new或std::stringcopy构造函数可以抛出,但这不是我的重点。我只是想知道取消引用u是否会引发异常。我觉得奇怪的是,operator*没有标记noexcept,而std::unique_ptr方法get实际上标记了noexcept。换言之: *( u.get() ) 作为一个整体,noexcept *u 不是。这是标准中的缺陷吗?我不明白为什么会有不同。有什么想法吗?unique\u ptr::operator*()可能需要调用operator*()重载,以获取存储在uni

我知道
new
std::string
copy构造函数可以抛出,但这不是我的重点。我只是想知道取消引用
u
是否会引发异常。我觉得奇怪的是,
operator*
没有标记
noexcept
,而
std::unique_ptr
方法
get
实际上标记了
noexcept
。换言之:

*( u.get() )
作为一个整体,
noexcept

*u

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

unique\u ptr::operator*()
可能需要调用
operator*()
重载,以获取存储在
unique\u ptr
中的类型。请注意,存储在
unique\u ptr
中的类型不必是裸指针,您可以通过嵌套类型
D::pointer
更改类型,其中
D
unique\u ptr
的删除器的类型。这就是为什么函数不是
noexcept


此警告不适用于您的用例,因为您正在
unique\u ptr
中存储
std::string*
,而不是一些重载
运算符的类型*
。因此,对您来说,调用实际上是
noexcept

如何
*(u.get())
noexcept
?无法
u.get()
返回
nullptr
?@BartoszKP返回
nullptr
noexcept
相关的情况如何?@BartoszKP:Um,cplusplus.com上的参考称get是noexcept。。。据我所知,取消对nullptr的引用不会引发异常。无论如何,在我尝试去引用它之前,我会检查一下(u)@Slava是的,你说得对。我的意思是,
operator*
可以验证您是否正在解引用空指针,如果是,则抛出,而
get()
不应该这样做。但这仍然没有意义,因为
operator->
noexcept
…cppreference.com说
operator*
可能抛出,让我们看看标准说法是什么,可以将其标记为
noexcept(noexcept(*std::declval())
?@RyanHaining可能适用于我描述的边缘情况,但如果
t
是指针呢?现在,您在
noexcept
规范中得到了
nullptr
的尊重。我没有意识到操作符*与*(.get())相比可能会如此复杂。非常有趣,谢谢你详细说明!如果
T
nullptr\u T
,表达式仍然没有实际计算,我认为我也不理解您的观点,不使用
操作符*
使
noexcept
允许实现通过在调试模式下抛出异常来诊断UB(如果存储的指针为null)。