После просмотра Вы не знаете const и изменчивый Я немного озадачен, как справиться mutable
правильно в будущем.
Пока думаю дело const
в значительной степени безопасен, поскольку по умолчанию можно использовать физический доступ только для чтения (минус старый логика исключение), правильная обработка mutable
озадачивает меня
Например, с новым threadsafe-условием следующее выглядит неправильно:
int main() {
int n;
[=]() mutable {n = 10;}();
return n;
}
Я бы предположил, что в этом случае n
должен быть завернут в std::atomic
или копия n
быть защищенным одновременными записями по-другому !?
Возможно, вам будет понятнее, если мы выписали лямбда явно:
struct mylambda
{
mylambda(int n) : n(n) {}
void operator()() /* const <- lambda specified as mutable, operator not const */
{
n = 10;
}
private:
int n;
};
int main() {
int n = 0;
mylambda(n)();
return n;
}
(Примечание: у вас на самом деле есть неопределенное поведение в вашем примере, потому что, когда ваша лямбда копирует n
, это чтение из неинициализированной переменной. Я инициализировал это здесь, чтобы исправить эту маленькую ошибку.)
Как вы можете видеть, у вас нет изменяемых членов, поэтому ничего не нужно менять, чтобы быть потокобезопасным (согласно докладу). Просто обычная переменная-член, которая может меняться через неконстантная функция-член; неконстантные функции-члены не считаются поточно-ориентированными.
Я не знаю, можете ли вы пометить лямбда-член как mutable
; если бы вы могли, вы могли бы оказаться в положении, когда безопасность потоков является проблемой (в сочетании с оператором вызова функции const). Но я не думаю, что это возможно.
Других решений пока нет …