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)} }