18

我试图了解何时是使用随附的一些结构的合适时间,并且对使用with referenceboost有疑问。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,调用者仍然需要测试是否返回了助手。

boost::optional如果您需要知道“价值”和“非价值”之间的区别,您是否应该只使用nullptr

4

2 回答 2

20

与原始指针相比,可选引用可能表明 (1) 不使用指针算法,以及 (2) 在其他地方维护所指对象的所有权(因此delete显然不会与变量一起使用)。

于 2013-06-09T09:12:40.327 回答
20

很好的问题,上面 John Zwinck 的回答是正确的。然而,有些人(例如,标准化委员会的许多人)怀疑这些理由是否足以证明 存在的合理性optional<T&>,何时optional<T&>会有如此令人困惑的语义。考虑一下当你分配给其中一个人时会发生什么。它应该重新定位引用(即,使其指向不同的对象),还是像真实的T&那样通过引用进行分配?可以为任何一种情况做一个案例,这会导致混乱和微妙的错误。从最近被 C++14 接受的提案optional<T&>中删除了对的支持。

简而言之,如果您想让您的代码可移植到 C++14 中,请std::optional优先选择T*.boost::optional<T&>

于 2013-06-10T17:00:34.430 回答