Категория значений переменной const int, захваченная лямбда-выражением

Я пытался понять, когда и когда лямбда с перехватом по умолчанию 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 не вносит заметной разницы в вывод компиляторов.

8

Решение

Задача ещё не решена.

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

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

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