在我看来应该有四种变体boost::optional
optional<Foo>
=> 持有一个可变的 Foo 并且可以在初始化后重新分配optional<Foo const> const
=> 持有一个 const Foo 并且在初始化后不能重新分配optional<Foo> const
=>(应该?)持有一个可变的 Foo 但在初始化后不能重新分配optional<Foo const>
=> (should?) 持有一个 const Foo 并且可以在初始化后重新分配
前 2 个案例按预期工作。但是对optional<Foo> const
const Foo 的取消引用,并且optional<Foo const>
不允许在初始化后重新分配(如本问题所述)。
const 值类型的重新分配具体是我遇到的,错误是:
/usr/include/boost/optional/optional.hpp:486:错误:将 'const Foo' 作为 'Foo& Foo::operator=(const Foo&)' 的 'this' 参数传递会丢弃限定符 [-fpermissive]
它发生在这里:
void assign_value(argument_type val,is_not_reference_tag) { get_impl() = val; }
构造后,实现将赋值运算符用于您参数化可选项的类型。它显然不想要一个 const 值的左操作数。但是为什么不能将非 const 选项重置为新的 const 值,例如在这种情况下:
optional<Foo const> theFoo (maybeGetFoo());
while (someCondition) {
// do some work involving calling some methods on theFoo
// ...but they should only be const ones
theFoo = maybeGetFoo();
}
一些问题:
想要这个在概念上是好的,而不能做到这一点只是实施中的侥幸,我对吗?
如果我不编辑 boost 源,那么在不完全废弃 boost::optional 的情况下实现上述循环中的逻辑的干净方法是什么?
如果这确实有意义并且我要编辑 boost::optional 源(我已经不得不这样做以使其支持可移动类型,尽管我怀疑他们很快就会自己这样做)那么微创更改可能做这个把戏?