Лямбды на месте можно использовать для комплексной инициализации. Таким образом, вы можете сделать что-то вроде этого:
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
Согласно блогу , где я читал это,первый фрагмент кода является потокобезопасным. Это позволяет избежать необходимости использовать дорогостоящую синхронизацию. Таким образом, вам не нужно использовать блокировку мьютекса для последнего бита кода, чтобы обеспечить синхронизацию.
Мой вопрос: что делает первый поток безопасным? Как это работает?