我正在尝试了解何时适合使用boost
附带的某些结构,并对boost::optional
与引用的使用有疑问。
假设我有以下课程,使用boost::optional
:
class MyClass {
public:
MyClass() {}
initialise(Helper& helper) {
this->helper = helper;
}
boost::optional<Helper&> getHelper() {
return helper;
}
private:
boost::optional<Helper&> helper;
}
为什么我会使用上述代替:
class MyClass {
public:
MyClass() : helper(nullptr) {}
initialise(Helper& helper) {
this->helper = &helper;
}
Helper* getHelper() {
return helper;
}
private:
Helper* helper;
}
它们都传达了相同的意图,即getHelper
可以返回null
,并且调用者仍然需要测试是否返回了帮助。
如果你需要知道'a value',boost::optional
和'not value'之间的区别,你是否只使用nullptr
?
答案 0 :(得分:20)
很好的问题,John Zwinck的答案是正确的。然而,有些人(例如标准化委员会中的许多人)怀疑这些原因是否足以证明optional<T&>
的存在是合理的,当optional<T&>
可能有这种令人困惑的语义时。考虑一下当你分配给其中一个人时会发生什么。它应该重新定位引用(即,使其指向不同的对象),还是通过引用分配,就像真正的T&
一样?可以为一种情况做出一个案例,这会引起混乱和微妙的错误。已从最近被C ++ 14接受的proposal中删除了对optional<T&>
的支持。
简而言之,如果您希望将代码移植到C ++ 14 std::optional
,请T*
优先于boost::optional<T&>
。
答案 1 :(得分:19)
与原始指针相比,可选引用可能表明(1)指针算术未被使用,(2)所指对象的所有权保留在其他地方(因此delete
显然不会与变量一起使用)。