Demystifying Lambda Type Deduction with "auto" in C 11
In the realm of C 11, the introduction of lambda expressions has raised questions regarding their underlying type when deduced using the "auto" keyword. The assumption that a lambda's type is a function pointer proves inaccurate, as demonstrated in the following code snippet:
#define LAMBDA [] (int i) -> long { return 0; } int main () { long (*pFptr)(int) = LAMBDA; // ok auto pAuto = LAMBDA; // ok assert(typeid(pFptr) == typeid(pAuto)); // assertion fails! }
This code exhibits the discrepancy in type deduction between a function pointer and the lambda expression using the "auto" keyword. Intriguingly, the assertion fails, revealing that the type of the lambda is not a function pointer.
Unveiling the True Nature of Lambda Types
To understand this apparent paradox, it is crucial to recognize that the type of a lambda expression remains unspecified in C 11. They serve as syntactic constructs that translate seamlessly into functors. Within this conversion, enclosed elements within the square brackets ("[]") become constructor parameters and class members, while elements within parentheses become parameters for the functor's operator().
Notably, a lambda without variable capture (empty square brackets) possesses the ability to be converted into a function pointer, a capability not supported by MSVC2010. However, it remains vital to emphasize that although such a conversion is possible, the inherent type of the lambda is a distinct unspecified functor type.
Conclusion
The "auto" keyword offers convenience in type deduction, but it is essential to discern the underlying types of different language entities. In the case of lambda expressions, their unspecified nature and potential for conversion to function pointers (where applicable) highlight the flexibility provided by C 11 while also reinforcing the importance of understanding the intricate nuances of the language.
The above is the detailed content of Why Doesn't `auto` Deduce a Lambda Expression's Type as a Function Pointer in C 11?. For more information, please follow other related articles on the PHP Chinese website!