需求

A类掌握资源,使用 shared_ptr 来指向资源。其他 B,C,D 类使用资源,在构造函数中使用 weak_ptr 作为引用参数来接收资源指针。但是编译是会报错,报错信息: error: cannot bind non-const lvalue reference of type ‘std::weak_ptr<>&’ to an rvalue of type ‘std::weak_ptr<>’

解决

解决办法很简单,在构造函数的参数 weak_ptr 前面加上 const.

std::unique_ptr<CommandProcess> process_;
std::shared_ptr<MessageQueue> send_;

process_ = make_unique<CommandProcess>(send_);

CommandProcess::CommandProcess(const weak_ptr<MessageQueue>& send) : send_(send)
{
}

参考

c++ 智能指针 传参

GotW #91 Solution: Smart Pointer Parameters

C/C++面试:weak_ptr的使用场景

关于c ++:我应该通过引用传递shared_ptr吗?

C++ shared_ptr 作为参数和返回值的比较

C++11:再谈shared_ptr,以及shared_ptr参数传递以及构造细节

C++非const引用问题:error: cannot bind non-const lvalue reference of type

【报错】关于{Error} cannot bind non-const lvalue reference of type ‘std::String&‘ to an rvalue……的一个解决方案

非const引用参数传入不同类型编译不过的理解(拒绝将临时对象绑定为非const的引用的形参是有道理的)

C++禁止引用非const的临时变量