我想到在C ++中可以使用类型std::optional<std::reference_wrapper<T>>
。这种类型的对象本质上是对类型为T
的对象或空值的引用,即几乎是一个指针。我的问题:
std::optional<std::reference_wrapper<T>>
和T*
之间是否有任何概念差异?
有什么实际区别吗?是否有可能选择std::optional<std::reference_wrapper<T>>
而不是T*
?
答案 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*
,您必须知道您是否有责任释放内存或其他人。当这是一个参考时,这不是你必须关心的事情。