Home >Backend Development >C++ >Why Does Adding a Unary ' ' Operator Allow Lambda Reassignment in C ?
A Positive Lambda: ' []{}' - Delving into the Unexpected
In an attempt to investigate the enigmatic nature of lambda expressions, the question of "Redefining lambdas not allowed in C 11, why?" arose. A peculiar discovery by Johannes Schaub revealed that adding a unary operator before the initial lambda allows it to compile.
The Query:
Why does the following code compile without errors:
int main() { auto test = +[]{}; // Note the unary operator + before the lambda test = []{}; }
Is this behavior in accordance with the C standards?
The Unveiling:
Yes, the code conforms to the C standards. The operator remarkably triggers a conversion of the lambda into a plain function pointer.
The Unfolding:
The compiler interprets the initial lambda ([]{}) and creates a closure object. Since this lambda does not capture any variables, a conversion function exists to convert the closure object into a function pointer with identical parameters and return type as the closure's function call operator.
This conversion aligns with the requirement of the unary operator. The built-in overloads for include one that converts any type T to a pointer to T. The closure type fulfills this requirement by providing a conversion to a function pointer.
Consequently, the expression auto test = []{}; deduces the type of test to be void(*)(). This enables the subsequent assignment in the second line, where the second lambda/closure object also undergoes the conversion to a function pointer, resulting in a compatible assignment.
Significance:
This unusual behavior highlights the versatility of lambda expressions and the intricate mechanisms of the C language. It enables the reassignment of lambda expressions by converting them to function pointers, offering flexibility and code optimization possibilities.
The above is the detailed content of Why Does Adding a Unary ' ' Operator Allow Lambda Reassignment in C ?. For more information, please follow other related articles on the PHP Chinese website!