c++ lambda c++14 language-lawyer member-initialization

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 & para this , 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 .