boost ::необязательный, не позволяющий мне переназначать константные типы значений

Мне кажется должно быть четыре вариантаboost::optional

  • optional=> содержит изменяемый Foo и может быть переназначен после инициализации

  • optional const=> содержит константу Foo и не может быть переназначен после инициализации

  • optional const=> (должен? )содержит изменяемый Foo, но не может быть переназначен после инициализации

  • optional=> (должен? )содержит константу Foo и может быть переназначен после инициализации

Первые 2 случая работают как положено. Но optional constразыменовывает константу 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 ::(, который я уже должен был сделать, чтобы он поддерживал подвижные типы , хотя я подозреваю, что они будут это делать сами скоро )тогда какие минимально инвазивные изменения могли бы помочь?

6
задан Community 23 May 2017 в 12:23
поделиться