请考虑以下代码:
void h(M m2)
{
...
}
int main()
{
while (true) {
M m1 = ...;
std::thread t(h, std::move(m1));
t.detach();
}
}
是否保证m2
正确move
- 在m1
被销毁之前从m1
构建?还是有比赛?
答案 0 :(得分:4)
标准对我来说似乎很清楚:
效果:构造一个类型为thread的对象。新的执行线程执行
INVOKE (DECAY_COPY ( std::forward<F>(f)), DECAY_COPY (std::forward<Args>(args))...)
调用DECAY_COPY
在构造线程中进行评估。
由于副本是在调用线程中完成的,因此它必须在构造函数调用返回之前完成。
m2
的构建是从另一个对象(DECAY_COPY的结果)完成的,而不是来自m1
,因此m1
是否已被销毁或者无关紧要不
DECAY_COPY的结果必须由实现存储在某处,以便在目标函数初始化之前它不会超出范围,但这是实现的正确工作。 m1
的销毁对它没有任何影响。