Подтвердить что ты не робот

Использование lambda в инициализаторе по умолчанию gcc vs clang

#include <cassert>
#include <cmath>

int main()
{
    struct point_of_cone
    {
        double x, y;
        double z = [&] { using std::sqrt; return sqrt(x * x + y * y); }();
    };
    point_of_cone p = {3.0, 4.0};
    assert(p.z == 5.0);
}

Прекрасно работает для clang++ из соединительной линии, но для g++ из магистрали с сообщением об ошибке (link):

ошибка: 'this' не была записана для этой лямбда-функции

Определение point_of_cone в области пространства имен отлично подходит для обоих.

Немного измененное определение с [this] лямбда-захватом отлично работает и для обеих сторон, либо для глобальной или локальной области.

Какой компилятор прав?

4b9b3361

Ответ 1

Это ошибка gcc.

int main() {
    struct A {
        int x, i = [&] { return x; }();
    } a{0};
}

Это не удается, но если мы...

  • измените & на this или
  • объявить A как имеющую область пространства имен,

он работает. Тем не менее, ни одно из них не должно влиять на корректность.

Сообщено: # 78019.