Почему неконстантная ссылка должна быть инициализирована lvalue?

Вот фрагмент кода, который вызывает ошибку C2664:

не может преобразовать аргумент 1 из ‘std :: unique_ptr<Компонент, станд :: default_delete<_Ty >> ‘до’ ComPtr &’

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

#include <memory>
#include <list>

class Component {
};

using ComPtr = unique_ptr<Component>;
using ComList = list<ComPtr>;
ComList coms;

void addComponent(ComPtr&c) {
coms.push_back(c);
}

int main() {
addComponent(make_unique<Component>()); //Error here.
return 0;
}

-1

Решение

Способ написать это, чтобы вам не приходилось делать то, с чем вы боретесь, это: https://godbolt.org/g/vceL4q

#include <memory>
#include <list>
using namespace std;

class Component {
};

using ComPtr = unique_ptr<Component>;
using ComList = list<ComPtr>;
ComList coms;

void addComponent(ComPtr c) { // <== change here
coms.push_back(std::move(c)); // and here
}

int main() {
addComponent(make_unique<Component>());
return 0;
}

c в addComponent будет создан через конструктор перемещения, потому что результатом make_unique является значение r.

Таким образом, предпочтительно передавать большие (удобные для перемещения) структуры данных по значению.

4

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

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

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