【问题标题】:boost::optional<T&> vs T*boost::optional<T&> vs T*
【发布时间】:2013-06-09 08:45:37
【问题描述】:

我试图了解何时是使用 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”、nullptr 和“not a value”之间的区别,您是否应该只使用boost::optional

【问题讨论】:

  • boost::optional 只是 T* 的包装。比 boost::optional 更喜欢 T*,因为 boost::optional 在 C++ 中很奇怪。 T* 具有更好的可读性

标签: c++ boost boost-optional


【解决方案1】:

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

【讨论】:

  • 嗯,我想这是有道理的。谢谢。
  • 在现代 C++ 中,原始指针应该已经表明所有权在其他地方维护。
【解决方案2】:

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

简而言之,如果您想让您的代码可移植到 C++14 的 std::optional,请首选 T* 而不是 boost::optional&lt;T&amp;&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    相关资源
    最近更新 更多