Изменчивый функтор все еще «действителен» использоваться

После просмотра Вы не знаете const и изменчивый Я немного озадачен, как справиться mutable правильно в будущем.
Пока думаю дело const в значительной степени безопасен, поскольку по умолчанию можно использовать физический доступ только для чтения (минус старый логика исключение), правильная обработка mutable озадачивает меня
Например, с новым threadsafe-условием следующее выглядит неправильно:

int main() {
int n;
[=]() mutable {n = 10;}();
return n;
}

Я бы предположил, что в этом случае n должен быть завернут в std::atomic или копия n быть защищенным одновременными записями по-другому !?

3

Решение

Возможно, вам будет понятнее, если мы выписали лямбда явно:

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). Но я не думаю, что это возможно.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]