es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cuándo se pueden capturar implícitamente las variables constexpr por las lambdas constexpr?

#include <array>

template<typename f="">
constexpr auto call(const F& visitor)
{
    return visitor();
}

int main()
{
    constexpr int x = 10;
    constexpr std::array<int, 3=""> y = { 1, 2, 3};

    static_assert(call([]{ return x + 10; }) == 20);
    static_assert(call([&]{ return y[0] + 10; }) == 11);
}

El siguiente código no se compila debido a que el array no es accesible desde la segunda lambda. ¿Por qué la variable constexpr int está disponible en la primera lambda sin capturar, pero no el array en la segunda? ¿No están ambos disponibles sin necesidad de capturar? ¿Por qué el array tiene que ser capturado si es constexpr (lo cual hará que mi lambda sea una lambda no-constexpr debido a la captura)?</int,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El constexpr int está disponible en el primer lambda sin captura porque es una variable no mutable con tipo literal y puede evaluarse en tiempo de compilación. Por otro lado, el std::array y es una variable no mutable con tipo no literal y, por lo tanto, acceder a sus elementos requiere una evaluación en tiempo de ejecución. Por lo tanto, el segundo lambda necesita capturar a y para poder acceder a sus elementos, lo que lo convierte en un lambda no constexpr. Sin embargo, si el array se declarara como constexpr, entonces sería accesible en el segundo lambda sin captura y el lambda seguiría siendo constexpr.

Comments are closed.