这是怎么回事,标准没有提到once_flag的可移动性?我希望应用与 std::mutex 相同的参数。至少对于 gcc(4.8 版)来说,移动似乎被禁用了。如果某个编译器允许移动,那么最终可能会得到不可移植的代码。
概要是(\xc2\xa730.4 [thread.mutex])
\n\nstruct once_flag {\n constexpr once_flag() noexcept;\n once_flag(const once_flag&) = delete;\n once_flag& operator=(const once_flag&) = delete;\n};\nRun Code Online (Sandbox Code Playgroud)\n\n由于复制构造函数和复制赋值运算符是用户声明的(并显式删除),因此移动构造函数和移动赋值运算符不是隐式声明的 (\xc2\xa712.8 [class.copy]/p9, 20):
\n\n\n\n\n9 如果类的定义
\n\nX没有显式声明移动构造函数,则将隐式声明为默认构造函数当且仅当\n
\n\n- \n
X没有用户声明的复制构造函数,- \n
X没有用户声明的复制赋值运算符,- \n
X没有用户声明的移动赋值运算符,并且- \n
X没有用户声明的析构函数。20 如果类的定义
\n\nX没有显式声明移动赋值运算符,则将隐式声明为默认运算符,当且仅当\n
\n- \n
X没有用户声明的复制构造函数,- \n
X没有用户声明的移动构造函数,- \n
X没有用户声明的复制赋值运算符,并且- \n
X没有用户声明的析构函数。
因此,once_flag不能移动。
| 归档时间: |
|
| 查看次数: |
561 次 |
| 最近记录: |