Pregunta Acceso a la variable constexpr dentro de la expresión lambda sin capturar


En el siguiente ejemplo, puedo acceder al constexpr variable x desde adentro de la lambda y sin capturarlo explícitamente. Esto no es posible si x no está declarado como constexpr.

¿Hay reglas especiales que se aplican a constexpr para capturar?

int foo(auto l) {
    // OK
    constexpr auto x = l();
    auto y = []{return x;};
    return y();

    // NOK
    // auto x2 = l();
    // auto y2 = []{ return x2; };
    // return y2();        
}

auto l2 = []{return 3;};

int main() {
    foo(l2);
}

32
2018-05-09 06:53


origen


Respuestas:


¿Hay reglas especiales que se aplican a constexpr para capturar / acceder?

Sí, constexpr las variables pueden leerse sin capturar lambda:

Una expresión lambda puede leer el valor de una variable sin capturar   si la variable

  • tiene un tipo de enumeración o integral no volátil y se ha inicializado con una expresión constante, o
  • es constexpr y trivially copy constructible.

32
2018-05-09 07:03