c++ - llvm 3.7 0
Usando lambda en el inicializador por defecto gcc vs clang (1)
#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);
}
Funciona bien para clang++
from trunk, pero para g++
from trunk falla con un mensaje de error ( link ):
error: ''this'' no fue capturado para esta función lambda
La definición de point_of_cone
en el ámbito del espacio de nombres funciona bien para ambos.
La definición ligeramente modificada con [this]
captura lambda funciona bien también tanto en el ámbito global como en el local.
¿Qué compilador tiene razón?
Eso es un error gcc.
int main() {
struct A {
int x, i = [&] { return x; }();
} a{0};
}
Esto falla, pero si nosotros ...
- cambiar
&
parathis
, o - declarar
A
que tiene ámbito de espacio de nombres,
funciona. Sin embargo, ninguno de estos debería tener ningún efecto sobre la buena formación.
Reportado: #78019 .