Мой коллега показал мне программу с явным параметром объекта в лямбда-функции. Программа принимается двумя компиляторами, но выдает странный результат:
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
Мой коллега показал мне программу с явным параметром объекта в лямбда-функции. Программа принимается двумя компиляторами, но выдает странный результат: [code]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 [/code] [list] [*]И MSVC, и EDG возвращают 2 из main() несмотря на то, что, казалось бы, ожидается 1 из [i=1](this A){return i;}();, [*]EDG даже оценивает это константное выражение как 2, в то время как MSVC жалуется: [/list] [code]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 [/code] [list] [*]и GCC вообще отказывается его принимать: [/list] [code]error: a lambda with captures may not have an explicit object parameter of an unrelated type [/code] Онлайн-демо Не могли бы вы уточнить, что не так с программой и какая реализация правильная?