Мой коллега показал мне программу с явным параметром объекта в лямбда-функции. Программа принимается двумя компиляторами, но выдает странный результат:
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
Онлайн-демо
Не могли бы вы уточнить, что не так с программой и какая реализация правильная?
Мой коллега показал мне программу с явным параметром объекта в лямбда-функции. Программа принимается двумя компиляторами, но выдает странный результат: [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]
ошибка C2131: выражение не получило константу примечание: сбой вызван попыткой доступа к элементу объекта динамического типа 'A', в котором этот элемент не определен
[list] [*]и GCC вообще отказывается принять его: [/list]
ошибка: лямбда с захватами может не иметь явного параметра объекта несвязанного type
Онлайн-демо Не могли бы вы уточнить, что не так с программой и какая реализация правильная?