异步函数调用的参数生命周期

Argument lifetime of an asynchronous function call

Herb Sutter 在 GotW #91 Solution: Smart Pointer Parameters 中指出“ 由于结构化的生命周期,被调用函数的生命周期是调用函数的调用表达式的严格子集。” 这是否适用于异步函数调用?

void myFunc(Bar * arg);
...
auto bar = new Bar;
std::thread t1(myFunc,bar);
delete bar;
join t1;

我认为在这种情况下,删除 bar 可能会使传递给线程 t1 上的 myFunc 的参数无效。

1) 在这里你将一个 pointer 传递给 t1 的构造函数,所以所有结构化生命周期相关的语句只适用于指针而不适用于它的对象指向.

2) 此处没有异步函数调用 - 您正在调用 std::thread 构造函数,所有结构化生命周期语句仅适用于构造函数,而不是其最终会调用 myFunc 的副作用。