提升::可选<T&> vs T*
boost::optional<T&> vs T*
我想知道什么时候使用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&>
。
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 正在VS调试器中监视映射条目
- Confusion: decltype vs std::function
- 将IBM Rhapsody模型集成到VS 2019中
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用VS Code和CMake Tools运行自定义命令
- EASTL矢量<向量<int>>连续的
- 修改 VS Code 中的默认C++代码段
- 如何使用c++在VS 2019上运行SQL查询
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- 完美前进使用 std::forward vs RefRefCast
- 从VS 2015更新3更新到VS2015更新3 d后浮点计算行为不同的原因
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- consteval wrapper vs. source_location
- VS Code C++:不准确的系统包括路径错误(wchar.h,boost/lambda/lambda.hpp)
- QStringList vs list<shared_ptr<QString>> 性能比较C++