已删除的构造函数

时间:2016-12-16 02:46:24

标签: c++ multithreading

我一直关注这个关于并发性的视频系列,而这个人刚刚开始谈论关键部分。我们创建了一个名为' auto_lock'的模板类(我只是包含了麻烦的部分:

class auto_lock
{

    T& m_lock;
public:
    auto_lock(auto_lock& const) = delete;
    auto_lock(auto_lock&&) = delete;
    auto_lock& operator=(auto_lock& const) = delete;
    auto_lock& operator=(auto_lock&&) = delete;
    auto_lock(T& lock) throw() :
        m_lock{ lock }
    {
        m_lock.enter();
    }
};

我对这个类也有同样的错误(我再一次只包括代码的麻烦部分):

class critical_section
{
    CRITICAL_SECTION m_lock;

public:

    critical_section(critical_section& const) = delete;
    critical_section& operator=(critical_section& const) = delete;
    critical_section& operator=(critical_section&&) = delete;
    critical_section(critical_section&&) = delete;

    critical_section() throw()
    {
        InitializeCriticalSection(&m_lock);
    }
};

在我的主要功能中:

int main()
{
    auto lock = critical_section {}; //error here
    {
        auto guard = auto_lock<critical_section>{ lock };//and here
    }
};

具体错误是&#39;&#34; critical_section :: critical_section(critical_section&amp;&amp;)&#34; (在第42行声明)不能被引用 - 它是一个被删除的函数&#39;和&#39;&#34; auto_lock :: auto_lock(auto_lock&amp;&amp;)[with T = critical_section]&#34;。&#39; 我该怎么办?

2 个答案:

答案 0 :(得分:4)

这是几乎始终自动失败的地方,因为这些类型是不可复制的且不可移动的。

int main()
{
    critical_section lock{};
    {
        auto_lock<critical_section> guard{ lock };
    }
}

(如果您不喜欢这样,请等待C ++ 17强制复制省略实施)

为什么这需要副本?因为虽然这段代码不太可能复制,但仍然必须可以访问复制/移动构造函数才能使代码生效。 auto lock = critical_section{};critical_section lock = critical_section{};

相同

答案 1 :(得分:-1)

如果你追踪代码的作用

auto guard = auto_lock<critical_section>{ lock };//and here

来电

auto_lock::auto_lock(T& lock)

尝试使用m_lock调用

构建lock
critical_section::critical_section(critical_section&&)

已被删除。