Лямбда с выводом этого параметра несвязанного типаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Лямбда с выводом этого параметра несвязанного типа

Сообщение Anonymous »

Мой коллега показал мне программу с явным параметром объекта в лямбда-функции. Программа принимается двумя компиляторами, но выдает странный результат:

Код: Выделить всё

struct A {
int a = 2;
constexpr A(auto&&) {}
};

constexpr int f() {
return [i=1](this A){return i;}();
}

int main() {
return f(); // 2 in MSVC and EDG
}

static_assert( f() == 2 ); // true in EDG
  • И MSVC, и EDG возвращают 2 из main() несмотря на то, что, казалось бы, ожидается 1 из (this A){return i;}();,
  • EDG даже оценивает это константное выражение как 2, в то время как MSVC жалуется:


ошибка C2131: выражение не получило константу
примечание: сбой вызван попыткой доступа к элементу объекта динамического типа 'A', в котором этот элемент не определен

  • и GCC вообще отказывается принять его:


ошибка: лямбда с захватами может не иметь явного параметра объекта несвязанного type

Онлайн-демо
Не могли бы вы уточнить, что не так с программой и какая реализация правильная?

Подробнее здесь: https://stackoverflow.com/questions/798 ... lated-type
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»