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

时间:2018-02-10 13:28:25

标签: 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*

2 个答案:

答案 0 :(得分:4)

  

std::optional<std::reference_wrapper<T>>T*之间是否有任何概念上的区别?

std::optional<>,正如名称已经建议的那样,意味着在我们可以拥有一个值或根本没有任何价值时使用。

T*对象的等效没有值将为其分配nullptr,即:指针将指向无处 ,而不是某处(甚至任何地方,即:未初始化)。可以说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(),如果没有值,它会抛出异常(它提供的不安全{{1}如operator*()那样。)

另外,使用T*代替std::optional<std::reference_wrapper<T>>,例如,作为函数的返回值可能会以更明确的方式指示可能没有价值观。

答案 1 :(得分:1)

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

如果某个函数返回T*,您必须知道您是否有责任释放内存或其他人。当这是一个参考时,这不是你必须关心的事情。