为什么非常量引用必须用左值初始化?

时间:2018-08-14 04:04:43

标签: c++ c++11 smart-pointers lvalue-to-rvalue

这是导致C2664错误的代码段:

  

无法将参数1从'std :: unique_ptr >'转换为'ComPtr&'

那么为什么非常量引用必须用左值初始化?除了声明新变量外,如何避免这种情况?

#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 个答案:

答案 0 :(得分:4)

编写此代码的方法而不必要做与之战斗的方法: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;
}

由于make_unique的结果是一个右值,因此将通过move构造函数创建addComponent中的c

这种方式最好按值传递大型(移动友好的)数据结构。