将optional与reference_wrapper结合起来是否有意义?

Bob*_*bby 16 c++ pointers reference optional c++-standard-library

在我看来,在C++中可以使用该类型std::optional<std::reference_wrapper<T>>.这种类型的对象本质上是对类型对象T或空值的引用,即几乎是一个指针.我的问题:

  1. 有没有之间的任何概念上的差异std::optional<std::reference_wrapper<T>>T*

  2. 有什么实际区别吗?是否有可能选择std::optional<std::reference_wrapper<T>>结束的情况T*

Tim*_*imK 14

std::optional<std::reference_wrapper<T>>和之间的主要区别T*在于,T*您必须考虑谁拥有所指向的内存。

如果函数返回,T*您必须知道是您负责释放内存还是其他人负责。当它是参考时,这不是你必须关心的事情。

  • 除非您与某些纯 C 库交互,否则堆内存几乎总是由“unique_ptr”或“shared_ptr”、某种类型的池或容器(如“vector”)拥有。 (4认同)

眠りネ*_*ネロク 5

有没有之间的任何概念上的差异std::optional<std::reference_wrapper<T>>T*

std::optional<>顾名思义,它是指当我们可以有一个值或根本没有任何值时使用。

相当于不具有值用于一个T*对象将被分配nullptr给它,即:该指针将指向无处,而不是某个地方(或甚至任意位置的,即:未初始化)。可以说将for指针std::optional<>的概念导出nullptr到任意类型。因此,我想说它们在概念上非常相似,是std::option<>一种概括的方法。

有实际区别吗?是否存在建议选择的std::optional<std::reference_wrapper<T>>情况T*

我能想到的大小。std::optional<>包含一个内部标志,用于指示值的存在/不存在,而对于,T*则将nullptr其直接编码为指针可以存储的值之一。因此,std::optional<std::reference_wrapper<T>>对象将大于T*

在安全性方面,与不同T*std::optional<>提供了成员函数value(),如果没有值,该成员函数将引发异常(它提供的安全性与不安全性operator*()一样T*)。

同样,例如,使用std::optional<std::reference_wrapper<T>>代替代替T*作为函数的返回值可能以更明确的方式表明可能根本没有值。