为什么condition_variable不是MoveAssignable

Cur*_*ous 3 c++ move condition-variable c++11

为什么condition_variable不是MoveConstructible(根据http://en.cppreference.com/w/cpp/thread/condition_variable)?这禁止包含在许多std::unordered_map移动物体的容器(例如)中.

这迫使人们使用unique_ptr一个额外的堆分配,这make_shared是为了解决而构建的.此外,如果没有池分配器,这可能会变得非常低效.

dav*_*bak 5

condition_variable是一个同步构造,多个线程(可能)同时使用.(事实上​​,这就是它的目的.)你怎么能安全地移动它?例如,假设它直接包含一个螺旋锁.有些线程正在进程地址空间中的给定地址上旋转,您是否要将对象从其下移出?

无法移动任何类型的用户模式同步构造.实际同步的事情需要一个固定的地址.您可以强制该对象在不会被移动的堆分配对象上执行所有实际工作 - 并且您可以直接进入要避免的堆的间接.(内核模式同步构造可以移动:你有一个手柄,一些OS的事情,但他们更昂贵.使用.)

它们也无法复制 - 因为这意味着什么?

它必须是这样的.你的设计必须考虑到它,就是这样.

(而且我真的不明白你问题的第二段. make_shared是为了使引用数量更便宜并且与移动内容无关.池分配器可能会也可能不会改善任何特定情况,更不用说了这个,除非你测量它,否则你不会知道.)