Мне кажется должно быть четыре вариантаboost::optional
optional
=> содержит изменяемый Foo и может быть переназначен после инициализации
optional
=> содержит константу Foo и не может быть переназначен после инициализации
optional
=> (должен? )содержит изменяемый Foo, но не может быть переназначен после инициализации
optional
=> (должен? )содержит константу Foo и может быть переназначен после инициализации
Первые 2 случая работают как положено. Но optional
разыменовывает константу Foo, а optional
не допускает переназначения после инициализации (, как это было затронуто в этом вопросе).
Я столкнулся именно с переназначением типов значений const, и ошибка:
/usr/include/boost/optional/optional.hpp:486: error: passing ‘const Foo’ as ‘this’ argument of ‘Foo& Foo::operator=(const Foo&)’ discards qualifiers [-fpermissive]
И это происходит здесь:
void assign_value(argument_type val,is_not_reference_tag) { get_impl() = val; }
После строительства,реализация использует оператор присваивания для типа, которым вы параметризовали необязательный параметр. Очевидно, что ему не нужен левый операнд -, который является константным значением. Но почему бы вам не сбросить не -const, опционально, на новое константное значение, например, в этом случае:
optional theFoo (maybeGetFoo());
while (someCondition) {
// do some work involving calling some methods on theFoo
//...but they should only be const ones
theFoo = maybeGetFoo();
}
Некоторые вопросы:
Прав ли я, что хотеть этого концептуально хорошо, а неспособность сделать это - просто случайность в реализации?
Если я не редактирую источники наддува, что может быть чистым способом реализовать логику, как в приведенном выше цикле, без полного отказа от необязательных наддува ::?
Если это имеет смысл, и я должен был отредактировать дополнительный источник boost ::(, который я уже должен был сделать, чтобы он поддерживал подвижные типы , хотя я подозреваю, что они будут это делать сами скоро )тогда какие минимально инвазивные изменения могли бы помочь?