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