boost :: option - использование boost :: in_place для объекта, конструктор которого берет другой объект по ссылке - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь использовать 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' отбрасывает квалификаторы

Как это исправить?

1 Ответ

3 голосов
/ 03 апреля 2019

Используйте конструктор на месте.

В 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));
...