为什么boost可选参考不是T *的包装?

时间:2012-09-17 03:23:14

标签: c++ memory pointers boost reference

由于boost::optional<T&>已经是专业化,为什么不将它作为T*的包装器实现?这将允许它占用更少的空间,因为不需要m_initialized布尔值。

3 个答案:

答案 0 :(得分:6)

由于在引用的情况下优化了boost 1.61可选项。

发行说明提到:

sizeof(optional<T&>) == sizeof(T*)

因此在这种情况下肯定会实现为指针。

答案 1 :(得分:2)

可能是因为未初始化的boost::optional<T*>对象必须与使用boost::optional<T*>初始化的NULL不同,例如此函数不能返回任何值,NULL或非NULL指针

在这种情况下,为什么不使用普通指针,NULL表示没有值。无需在boost::optional<>之上添加更多复杂性。我的意思是,很容易让事情更大或更复杂,但很难让它们变得更好。

答案 2 :(得分:1)

首先,boost::optional<T&>不是专业化。如果您查看代码,您会看到它确实执行了一些基于标记的调度来自定义引用类型的行为,但boost::optional_base<T>类模板本身并不是专门的。

然而,为什么没有实施这种空间优化仍然是一个合理的问题。可能是因为它不是专业的,所以工作要难得多,我不知道。

关于为什么你更喜欢optional<T&>而不是原始指针的问题是一个完全独立的问题,所以请随意单独询问...