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显然不会与变量一起使用).