once_flag可以移动吗?

时间:2015-01-05 13:33:07

标签: c++ c++11

它是如何产生的,标准对once_flag的可移动性一无所知?我希望应用与std :: mutex相同的参数。至少对于gcc(版本4.8),移动似乎被禁用了。如果某个编译器允许移动,最终可能会得到不可移植的代码。

1 个答案:

答案 0 :(得分:4)

概要是(§30.4[thread.mutex])

struct once_flag {
    constexpr once_flag() noexcept;
    once_flag(const once_flag&) = delete;
    once_flag& operator=(const once_flag&) = delete;
};

由于复制构造函数和复制赋值运算符是用户声明的(并显式删除),因此不会隐式声明移动构造函数和移动赋值运算符(§12.8[class.copy] / p9,20):

  

9如果类X的定义未明确声明移动   构造函数,只有当一个隐式声明为默认值   如果

     
      
  • X没有用户声明的复制构造函数,
  •   
  • X没有用户声明的副本分配运算符
  •   
  • X没有用户声明的移动赋值运算符和
  •   
  • X没有用户声明的析构函数。
  •   
     

20如果类X的定义没有明确声明移动   赋值运算符,如果是,则将隐式声明为defaultaulted   并且只有

     
      
  • X没有用户声明的复制构造函数,
  •   
  • X没有用户声明的移动构造函数,
  •   
  • X没有用户声明的复制赋值运算符和
  •   
  • X没有用户声明的析构函数。
  •   

因此,once_flag无法移动。