This is great! Thanks for sharing, it is a cool idea to try bringing QoL improvements from Rust to C++. Got a question:
Does this prevent the RVO/NRVO compiler optimizations for return values? And when those fail, same question for the move-construction for types that do have a move constructor.
Have you considered using the immediately invoked function expression (IIFE) pattern as a standards-compliant alternative to gcc statement expressions?
The main problem with IIFE is the same as with a normal function:
You cannot return the caller function from inside the closure, making the "short-circuit" mechanism provided by questionmark (?) operator not possible.
With the GCC Extension, we get around that using a construct that is pretty similar to IIFE, it allows to return a value from an immediate expression created by a block of code that is surrounded by ({})
The nice thing about this block ({}) is that the last statement is used as the "return value" without an explicit return, this disambiguates between the "expression" return and the "function" return.
Without compiler support, the short-circit is not possible, but with this feature + macros we can create a function that behaves like that.
https://libfn.org/ also is worth a look.
This is great! Thanks for sharing, it is a cool idea to try bringing QoL improvements from Rust to C++. Got a question:
Does this prevent the RVO/NRVO compiler optimizations for return values? And when those fail, same question for the move-construction for types that do have a move constructor.
RVO/NRVO are valid and are not affected.
We are dealing with std::variant, and the move semantics are defined by the alternative. https://en.cppreference.com/w/cpp/utility/variant/operator%3...
Have you considered using the immediately invoked function expression (IIFE) pattern as a standards-compliant alternative to gcc statement expressions?
The main problem with IIFE is the same as with a normal function:
You cannot return the caller function from inside the closure, making the "short-circuit" mechanism provided by questionmark (?) operator not possible.
With the GCC Extension, we get around that using a construct that is pretty similar to IIFE, it allows to return a value from an immediate expression created by a block of code that is surrounded by ({})
The nice thing about this block ({}) is that the last statement is used as the "return value" without an explicit return, this disambiguates between the "expression" return and the "function" return.
Without compiler support, the short-circit is not possible, but with this feature + macros we can create a function that behaves like that.
[flagged]
Please leave that Frankenstein of a language alone. Stop bolting features on it, it's already a monster.