Использование 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]
лямбда-захватом отлично работает и для обеих сторон, либо для глобальной или локальной области.
Какой компилятор прав?
Ответы
Ответ 1
Это ошибка gcc.
int main() {
struct A {
int x, i = [&] { return x; }();
} a{0};
}
Это не удается, но если мы...
- измените
&
на this
или
- объявить
A
как имеющую область пространства имен,
он работает. Тем не менее, ни одно из них не должно влиять на корректность.
Сообщено: # 78019.