我正在尝试理解什么时候是使用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
吗?
发布于 2013-06-09 17:12:40
与原始指针相比,可选引用可能暗示(1)不使用指针算法,(2)引用对象的所有权在其他地方保持不变(因此delete
显然不会与变量一起使用)。
发布于 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&>
。
https://stackoverflow.com/questions/17007949
复制相似问题