我一直关注这个关于并发性的视频系列,而这个人刚刚开始谈论关键部分。我们创建了一个名为' 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; 我该怎么办?
答案 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&&)
已被删除。