Я пытаюсь использовать boost::in_place для неподвижного и некопируемого объекта, конструктор которого берет другой объект по ссылке:
struct A
{
};
struct B
{
B(A& a): a_(a){}
B(B const &) = delete;
B(B&&) = delete;
B& operator=(B const &) = delete;
B& operator=(B&) = delete;
A& a_;
};
int main()
{
A a;
boost::optional<B> op(boost::in_place(a));
return 0;
}
Код не компилируется: привязка ссылки типа «A&» к «const A» отбрасывает квалификаторы
Как это исправить?





Используйте конструктор на месте.
В boost это этот конструктор, который принимает переменную in_place_init_t, а затем конструирует на месте со следующими аргументами.
boost::optional<B> op(boost::in_place_init, a);
// Calls `B::B(A&) with `a`
Или, чтобы продолжить использовать in_place, который по умолчанию принимает константную ссылку, укажите, что это не константная ссылка:
boost::optional<B> op(boost::in_place<A&>(a));
@Irbis Вероятно, это было добавлено, чтобы лучше соответствовать тому, как работает std::optional. Документация для boost::in_place довольно дрянная, но мне удалось заставить ее работать с фабрикой in_place (Документы здесь)
Мне нужно использовать boost 1.58, и я не вижу там in_place_init, поэтому мне приходится использовать второе решение, которое вы опубликовали.