提升::可选<T&> vs T*

boost::optional<T&> vs T*

本文关键字:gt vs lt 可选 提升      更新时间:2023-10-16

我想知道什么时候使用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,调用者仍然需要测试是否返回了一个helper。

如果你需要知道"值",nullptr和"不值"之间的区别,你应该只使用boost::optional吗?

与原始指针相比,可选引用可能意味着(1)不使用指针算术,(2)在其他地方维护引用的所有权(因此delete显然不会与变量一起使用)。

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

简而言之,如果你想让你的代码移植到c++ 14的std::optional上,选择T*而不是boost::optional<T&>