对于我的头文件中的以下模板定义,
template<typename T>
class node{
private:
T& data;
shared_ptr<node<T>>& next;
public:
node(T&);
~node();
};
template<typename X>
class list{
private:
shared_ptr<X>& head;
public:
list();
~list();
};
以及 main()
中的以下代码行:
list<node<string>>menu;
对于 shared_ptr<X>& head
的成员初始化,我得到以下编译错误在构造函数中:
template<typename X>
list<X>::list():head(make_shared<X>(NULL)){
}
error: cannot bind non-const lvalue reference of type "std::shared_ptr<node<std::basic_string<char> > >" to an rvalue of type "std::shared_ptr<node<std::basic_string<char> > >"
list<X>::list():head(make_shared<X>(NULL)){
^
我的理解是错误源于试图将调用生成的右值绑定(bind)到 make_shared()
左值 shared_ptr<X>& head
.
我该如何解决这个错误?
最佳答案
问题如下,你正在创建一个临时的
make_shared<X>(NULL)
那将在该行执行后消失,并且您类中的引用将悬空(即引用已被破坏的东西),如果您尝试访问该引用,您将处于未定义的行为区域(您的程序可能会崩溃) ,或者更糟的是继续处于损坏状态)。
修复它的一种方法是不使用对 shared_ptr
的引用,而是在所有类中直接使用 shared_ptr
,这样更安全。
其次,您可能想使用 nullptr
而不是 NULL
最后,我认为您误解了引用应该做什么:它们与资源的所有权无关,而只是允许访问资源,当您引用某物时,您必须确保其他人是只要您想通过引用访问资源,就让该资源保持事件状态(有一个异常(exception):通过本地常量引用延长生命周期,请参阅 https://blog.galowicz.de/2016/03/23/const_reference_to_temporary_object/ )。
关于c++ - 与在构造函数中将非常量左值绑定(bind)到右值相关的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56911929/