与在构造函数中将非常量左值绑定到右值相关的错误

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/)。