gpt4 book ai didi

c++ - 使用就地 lambda 进行复杂的初始化,尤其是 const

转载 作者:行者123 更新时间:2023-12-03 18:01:54 27 4
gpt4 key购买 nike

就地 lambda 可用于复杂的初始化。所以你可以这样做:

const widget x = [&]{
widget val; // assume that widget has a default constructor
for (auto i = 2; i <= N; ++i) { // this could be some
val += some_obj.do_something_with(i); // arbitrarily long code
} // needed to initialize x
return val; }();

这比写这样的东西要好:

widget x;   // should be const, but:
for (auto i = 2; i <= N; ++i) { // this could be some
x += some_obj.do_something_with(i); // arbitrarily long code
} // needed to initialize x
// from here, x should be const, but we can't say so in code in this style

根据blog在我读到这篇文章的地方,前一段代码是线程安全的。这避免了必须使用昂贵的同步。因此,您不需要为后面的代码使用互斥锁来确保同步。

我的问题是什么使前一个线程安全?它是如何工作的?

最佳答案

我相信“博客”指的是这样的假设,即 const 对象的使用应该只涉及读取操作,因此应该可以在多个线程中安全地使用而无需同步。这是“博客”部分的最后一句话:

You can not change its value and, therefore, you can use it in a multithreading program without expensive synchronization.

但是,这种说法通常是不正确的。正如@VTT 所指出的,类可能具有 mutable 成员变量,或者,例如,引用成员变量。因此,无法普遍保证 const 对象可以在没有同步的情况下安全地用于多线程代码。

您可能还会注意到相应的项目 ES.28在 C++ 核心指南中,在这个问题的上下文中根本没有提到多线程。

关于c++ - 使用就地 lambda 进行复杂的初始化,尤其是 const,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58688688/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com