首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >boost::optional<T&> vs T*

boost::optional<T&> vs T*
EN

Stack Overflow用户
提问于 2013-06-09 16:45:38
回答 2查看 3.8K关注 0票数 18

我正在尝试理解什么时候是使用boost附带的一些结构的正确时机,并且对boost::optional的使用有一个问题。

假设我有以下类,使用boost::optional

代码语言:javascript
复制
class MyClass {
public:
   MyClass() {}

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

   boost::optional<Helper&> getHelper() {
      return helper;
   }

private:
   boost::optional<Helper&> helper;
}

为什么我要使用上面的代码而不是:

代码语言:javascript
复制
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吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-09 17:12:40

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

票数 20
EN

Stack Overflow用户

发布于 2013-06-11 01:00:34

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

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

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17007949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档