C++ 使用std::在C+中移动+;11具有统一初始化语法的移动构造函数
我有一个简单的课程:C++ 使用std::在C+中移动+;11具有统一初始化语法的移动构造函数,c++,c++11,move,move-constructor,C++,C++11,Move,Move Constructor,我有一个简单的课程: struct Worker { Worker() : done{false} {} Worker(const Worker& rhs) : done{rhs.done}, qworker{} {} Worker(Worker &&rhs) : done{rhs.done} { qworker = std::move(rhs.qworker); }
struct Worker
{
Worker() : done{false} {}
Worker(const Worker& rhs) : done{rhs.done}, qworker{} {}
Worker(Worker &&rhs) : done{rhs.done}
{
qworker = std::move(rhs.qworker);
}
...
}
使用gcc-4.7.2可以很好地编译这个版本,但是如果我尝试使用这个版本,我会得到一个错误
struct Worker
{
Worker() : done{false} {}
Worker(const Worker& rhs) : done{rhs.done}, qworker{} {}
Worker(Worker &&rhs) : done{rhs.done}
, qworker{std::move(rhs.qworker)} // <- ERROR
{
}
...
}
struct Worker
{
Worker():完成{false}{}
Worker(constworker&rhs):完成{rhs.done},qworker{}{}
工人(工人和工人):完成{rhs.done}
,qworker{std::move(rhs.qworker)}/根据C++11标准std::function
有一个接受任何参数类型的无约束构造函数模板:
template<class F> function(F f);
这是无效的,因为rhs.qworker
不是可调用的对象,但只有在尝试调用函数对象时才会发生错误
如果您说qworker(std::move(rhs.qworker))
则初始值设定项列表构造函数不是候选构造函数,而是调用move构造函数
标准()中有一个缺陷报告,它通过阻止调用函数(F)
构造函数模板来修复此问题,除非参数是可调用对象。这会阻止创建初始值设定项列表
,而不是qworker{std::move(rhs.qworker)}
按预期调用移动构造函数。GCC 4.7没有实现LWG 2132的解析,但GCC 4.8实现了。qworker的类型是什么?qworker
?std::deque qworker;嗯,这可能是个bug。它在GCC 4.8.0上编译(请参阅)谢谢Andy在4.8上测试,我可以确认:现在编译!:(这是一个bug?@Gian将大括号改为括号,它将在gcc 4.7.2上编译。qworker(std::move(rhs.qworker))
template<class F> function(F f);
{ std::function<void()>{std::move(rhs.qworker)} }