与在构造函数中将非常量左值绑定到右值相关的错误
error related to binding non-const lvalue to rvalue in constructor
对于我的头文件中的以下模板定义,
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)){
^
我的理解是,错误源于试图将调用 make_shared()
生成的右值绑定到左值 shared_ptr<X>& head
。
我该如何解决这个错误?
问题如下,您正在创建临时
make_shared<X>(NULL)
将在该行执行后消失,并且 class 中的引用将悬空(即引用已被破坏的内容),如果您尝试访问该引用,您将处于未定义行为领土(您的程序可能会崩溃,或者更糟的是继续处于损坏状态)。
解决它的方法是不使用对 shared_ptr
的引用,而是在所有 class 中直接使用 shared_ptr
,这样更安全。
其次,您可能想使用 nullptr
而不是 NULL
最后,我认为你误解了引用应该做什么:它们与资源的所有权无关,而只是允许访问资源,当你引用某物时,你必须确保有人只要您想通过引用访问资源,else 就会使该资源保持活动状态(有一个例外:通过本地常量引用延长生命周期,请参阅 https://blog.galowicz.de/2016/03/23/const_reference_to_temporary_object/)。
对于我的头文件中的以下模板定义,
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)){
^
我的理解是,错误源于试图将调用 make_shared()
生成的右值绑定到左值 shared_ptr<X>& head
。
我该如何解决这个错误?
问题如下,您正在创建临时
make_shared<X>(NULL)
将在该行执行后消失,并且 class 中的引用将悬空(即引用已被破坏的内容),如果您尝试访问该引用,您将处于未定义行为领土(您的程序可能会崩溃,或者更糟的是继续处于损坏状态)。
解决它的方法是不使用对 shared_ptr
的引用,而是在所有 class 中直接使用 shared_ptr
,这样更安全。
其次,您可能想使用 nullptr
而不是 NULL
最后,我认为你误解了引用应该做什么:它们与资源的所有权无关,而只是允许访问资源,当你引用某物时,你必须确保有人只要您想通过引用访问资源,else 就会使该资源保持活动状态(有一个例外:通过本地常量引用延长生命周期,请参阅 https://blog.galowicz.de/2016/03/23/const_reference_to_temporary_object/)。