Я пытался понять, когда и когда лямбда с перехватом по умолчанию odr-использует переменную с автоматической продолжительностью хранения, определенной в его окружающей области видимости (подсказано этот ответ). Исследуя это, я натолкнулся на небольшое любопытство. GCC и Clang, по-видимому, не согласны с категорией значения id-выражения n
в следующем коде:
template <typename T> void assert_is_lvalue(const T&) {}
template <typename T> void assert_is_lvalue(const T&&) = delete;
int main() {
const int n = 0;
[=] { assert_is_lvalue(n); };
}
Clang успешно компилирует код, а GCC — нет (error: use of deleted function
). Который правильный? Или это что-то, что не определено или определяется реализацией?
Предполагается, что привязка ссылки к объекту использует его odr, и это подтверждается удалением лямбда-захвата по умолчанию и наблюдением, что оба компилятора потом жалуются, что n
не может быть захвачен безоговорочно без захвата по умолчанию.
Маркировка лямбды как mutable
не вносит заметной разницы в вывод компиляторов.
Задача ещё не решена.
Других решений пока нет …