Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

405
Views
¿Por qué `auto &&` no se comporta como la llamada "referencia universal" cuando se usa como argumento lambda?

¿Por qué el tipo de argumento && en el siguiente ejemplo no se comporta como la llamada "referencia universal" a pesar de que parece estar en un "contexto deducido" y, en cambio, se interpreta como un valor r:

 auto main() -> int { using MyFn = void (*)(int &); MyFn special = [](auto && thing) {}; // compile error, deduced as int && rather than int& return 0; }

Mientras que lo siguiente, que espero que sea equivalente, ¿funciona?

 template <typename T> void foo(T &&){}; auto main() -> int { using MyFn = void (*)(int &); MyFn specialC = foo; return 0; }

Sospecho que hay algún detalle esotérico con la conversión de lambdas en punteros de función que importa aquí, pero hasta ahora no puedo resolverlo.

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Las referencias de reenvío están respaldadas por una regla de deducción especial. La regla establece que si necesitamos deducir T para hacer que T&& sea idéntico a U& , entonces T se deduce como U& (de modo que T&& será U& (&&) , que simplemente se reduce a U& ).

Sin embargo, esta regla especial solo se aplica en determinadas circunstancias: al deducir argumentos de plantilla de plantilla de función basados en los argumentos de una llamada de función ( [temp.deduct.call]/3 ) (en el caso de que el argumento sea un valor l de tipo U , que puede imaginarse con el tipo " U& "), al tomar la dirección de una plantilla de función y al hacer coincidir una declaración de especialización de plantilla de función con una declaración de plantilla principal ( [temp.deduct.type]/10 ).

Su caso no es ninguno de los anteriores, sino que es un caso separado de deducción de argumentos de plantilla para una plantilla de función de conversión ( [temp.deduct.conv] ), que no tiene la regla especial para reenviar referencias.

Otro ejemplo en el que no se aplican las reglas de deducción de referencia de reenvío es el siguiente, que por lo tanto no compilará:

 template <class T> void foo(void(*)(T&&)) {} void bar(int&) {} int main() { foo(bar); }
over 4 years ago · Santiago Trujillo Report

0

En los parámetros lambda, auto por sí solo da una deducción de tipo universal. Así que esto hace lo que quieres:

 MyFn special = [](auto thing) {};

Demostración usando un tipo no copiable para demostrar que no está pasando por valor: https://godbolt.org/z/5vfWc6c8x

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!