boost :: опционально с постоянными членами

Почему это не работает?

struct O {
O(int i, int j)
: i(i)
, j(j)
{}

int const i;
int const j;
};

int main(int argc, char** argv)
{
boost::optional<O> i;
i.reset(O(4, 5));
return 0;
}

Кажется, он пытается использовать оператор присваивания вместо того, чтобы создать его на месте. Я предполагал, что это вызовет конструктор копирования O для неинициализированной памяти.

/..../include/boost/optional/optional.hpp:433:69: error: use of deleted function ‘O& O::operator=(const O&)’
.... error: ‘O& O::operator=(const O&)’ is implicitly deleted because the default definition would be ill-formed:
.... error: non-static const member ‘const int O::i’, can’t use default assignment operator
.... error: non-static const member ‘const int O::j’, can’t use default assignment operator

2

Решение

Boost.Optional использует либо присваивание, либо конструкцию копирования, в зависимости от состояния i, Поскольку это состояние является информацией времени выполнения, выбор между присваиванием и созданием копии также должен быть сделан во время выполнения.
Это означает, однако, что компилятор должен генерировать код для обеих опций, даже если один из них фактически никогда не используется. А это значит, что оба варианта должны быть возможны.

Чтобы заставить код работать, вы можете добавить (всегда неудачный) оператор присваивания class O:

O& O::operator=(const O&)
{
throw "this is not possible"return *this;
}

Как примечание стороны, Optional<T>::reset устарела. Вы должны просто использовать ассингмент, как в

i = O(4,5);

Описанная выше семантика действительна для обоих.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]