Попытка скомпилировать следующий код:
#include <functional>
void test() {
int a = 5;
std::function<void()> f = [a](){
[a]()mutable{ // isn't it capture 'a' by copy???
a = 13; // error: assignment of read-only variable 'a'
}();
};
}
дает ошибку error: assignment of read-only variable 'a'
.
Изменение кода путем добавления фигурных скобок к a
захвату:
#include <functional>
void test() {
int a = 5;
std::function<void()> f = [a](){
[a{a}]()mutable{ // this explicitly copies a
a = 13; // error: assignment of read-only variable ‘a’
}();
};
}
устраняет ошибку компиляции. Мне интересно, почему это так? Разве первый вариант не эквивалентен второму?
Это при использовании g++
версии 8.3.0 от Debian.
clang++
версия 7.0.1 успешно компилирует его.
Ошибка g++
?