c++ - 与在构造函数中将非常量左值绑定(bind)到右值相关的错误

标签 c++ templates shared-ptr rvalue

对于我的头文件中的以下模板定义,

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/

相关文章:

c++ - 计算平均值 C++

c++ - 设计用于标记和传输树的 C++ DSL

c++ - 对 boost::smart_ptr 的引用指向对象并检查它们的有效性

javascript - QML 和 C++ 中的 Null 和 Undefined

c++ - 强制 Eclipse 将 .c 文件视为 C++

c++ - 如何使用 QtDesigner 将菜单栏添加到 QFrame?

c++ - 当两个模板参数类型相同时如何进行偏特化?

c++ - 使用模板化函数参数的隐式类型转换

c++ - 构造函数期望指向正在创建的实例的共享指针

c++ - shared_ptrs 被删除两次