Лямбда с выводом этого параметра несвязанного типа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 жалуется:

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

error C2131: expression did not evaluate to a constant
note: failure was caused by attempting to access a member on an object of dynamic type 'A' in which the member is not defined
  • и GCC вообще отказывается его принимать:

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

error: a lambda with captures may not have an explicit object parameter of an unrelated type
Онлайн-демо
Не могли бы вы уточнить, что не так с программой и какая реализация правильная?

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

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