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.

¿Por qué no son invocables las lambdas genéricas const mutable?

Considere las siguientes cuatro lambdas:

#include <type_traits>

const auto f1 = auto mutable {};  // const, mutable, genérica
const auto f2 = auto {};          // const, genérica
const auto f3 = int mutable {};   // const, mutable
auto f4 = auto mutable {};        // mutable, genérica

static_assert(std::is_invocable_v<decltype(f1), int="">); // fallido
static_assert(std::is_invocable_v<decltype(f2), int="">); // no mutable, correcto
static_assert(std::is_invocable_v<decltype(f3), int="">); // no genérica, correcto
static_assert(std::is_invocable_v<decltype(f4), int="">); // no const, correcto

int main() {}

Ver demo en godbolt.org

¿Por qué las lambdas const, mutable y genéricas no son invocables, cuando cualquier combinación de const, mutable o genérica produce una lambda invocable?</decltype(f4),></decltype(f3),></decltype(f2),></decltype(f1),>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Los lambdas constantes, mutables y genéricos (f1) no pueden ser invocados debido a que tienen la palabra clave mutable, lo cual significa que el lambda puede modificar sus variables capturadas. Por lo tanto, al intentar invocar el lambda con un argumento entero, falla porque el lambda podría potencialmente modificar el entero pasado como argumento. Los otros tres lambdas no tienen la palabra clave mutable, por lo que se pueden invocar con un argumento entero. Si bien cualquier combinación de const, mutable o genérico puede producir un lambda invocable, la inclusión de la palabra clave mutable en f1 significa que no se puede invocar con ciertos tipos de argumentos, como los no mutables.

Comments are closed.