Once_flag 可以移动吗?

Cla*_*tus 3 c++ c++11

这是怎么回事,标准没有提到once_flag的可移动性?我希望应用与 std::mutex 相同的参数。至少对于 gcc(4.8 版)来说,移动似乎被禁用了。如果某个编译器允许移动,那么最终可能会得到不可移植的代码。

T.C*_*.C. 5

概要是(\xc2\xa730.4 [thread.mutex])

\n\n
struct once_flag {\n    constexpr once_flag() noexcept;\n    once_flag(const once_flag&) = delete;\n    once_flag& operator=(const once_flag&) = delete;\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
\n

9 如果类的定义X没有显式声明移动构造函数,则将隐式声明为默认构造函数当且仅当

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

20 如果类的定义X没有显式声明移动赋值运算符,则将隐式声明为默认运算符,当且仅当

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

因此,once_flag不能移动。

\n

  • 关于移动构造函数的隐式声明的标准术语位于 [class.copy]/9 中。 (3认同)