boost :: optional <t&> vs T * </t&>

时间:2013-06-09 08:45:38

标签: c++ boost boost-optional

我正在尝试了解何时适合使用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

2 个答案:

答案 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显然不会与变量一起使用)。