Проблема не в boost::optional
, а в логике того, что вы пытаетесь сделать. Сначала вы создаете контейнер const, а затем пытаетесь изменить содержимое. Я был бы удивлен, если бы это сработало.
Я думаю, что вы, вероятно, должны делать то, что делают стандартные контейнеры (например, vector
), и запрещать не копируемые аргументы шаблона.
В противном случае вам придется смириться с тем, что ваш метод set
не будет работать, если T
не копируется, и предоставить конструктор, который выполняет инициализацию:
class container
{
public:
container(reference init_value) : op(init_value) {}
};
int main()
{
foo f;
container<const foo> c(f); // OK
// c.set(f); NO
return 0;
}