boost :: optional <T&> vs T*

Lee*_*Lee 16 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;
}
Run Code Online (Sandbox Code Playgroud)

为什么我会使用上面的代替:

class MyClass {
public:
   MyClass() : helper(nullptr) {}

   initialise(Helper& helper) {
      this->helper = &helper;
   }

   Helper* getHelper() {
      return helper;
   }

private:
   Helper* helper;
}
Run Code Online (Sandbox Code Playgroud)

它们都传达了相同的意图,即getHelper可以返回null,并且调用者仍然需要测试是否返回了帮助程序.

boost::optional如果你需要知道'a value' nullptr和'not a value' 之间的区别,你应该只使用吗?

Eri*_*ler 20

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

简而言之,如果你想让你的代码可以移植到C++ 14,那就std::optional更喜欢T*了boost::optional<T&>.


Joh*_*nck 19

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

  • 在Modern C++中,原始指针应该已经表明所有权都在其他地方维护. (7认同)