
























c++14中lambda表达式中在捕获列表中[id=std::this_thread::get_id()]中的id 是指lambda所在的线程id吗?
auto lam1=[id=std::this_thread:get_id()]() {... std::thread::id id_1 = std::this_thread::get_id(); };
id 和 id_1 的值相同吗?
不一定相同,在 C++14 的 lambda 表达式中,id = std::this_thread::get_id() 捕获的 id 就是定义该 lambda 表达式时所在线程的 ID。而id_1是 运行该lambda表达式的所在线程id。
这是 C++14 引入的初始化捕获(Init Capture)特性。它的求值时机非常关键:
求值时机:初始化捕获(id = ...)右侧的表达式在 lambda 定义时就会立刻被求值。
捕获的值:这个求值结果(此处为线程 ID)会被捕获并存储为 lambda 的一个成员变量。
后续调用:之后无论这个 lambda 被哪个线程调用,id 的值都保持不变,始终是定义时的线程 ID。
所以id是定义lam1的线程的id
id_1是 lam1所在线程的id;
例如
std::thread th(lam1)
{
std::thread::id id_1 = std::this_thread::get_id();
}
th.join();
此时 id 和id_1不相同。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。