Info
-
Did you know about C++23 feature which removes unnecessary ()’s from C++ lambdas?
Example
int main() {
constexpr auto okay_in_cpp20 = [] {}; // okay in C++20
constexpr auto error_in_cpp20 = [] mutable {}; // okay in C++23
constexpr auto error_in_cpp20 = [] -> int { return {};}; // okay in C++23
}
Puzzle
- Can you remove unnecessary ()'s from the following lambda expressions?
int main() {
constexpr auto l1 = []() {};
constexpr auto l2 = []()mutable{};
constexpr auto l3 = []()mutable constexpr{};
constexpr auto l4 = []()mutable consteval{};
constexpr auto l5 = []()mutable consteval {};
constexpr auto l6 = []() -> int { return {}; };
constexpr auto l7 = []() -> auto { return 0; };
constexpr auto l8 = []<class...>() {};
constexpr auto l9 = []<auto...>() {};
constexpr auto l10 = []<auto...>() mutable {};
constexpr auto l11 = []<auto...>() noexcept {};
}
Solutions
int main() {
constexpr auto l1 = [] {};
constexpr auto l2 = [] mutable{};
constexpr auto l3 = [] mutable constexpr {};
constexpr auto l4 = [] mutable consteval {};
constexpr auto l5 = [] mutable consteval {};
constexpr auto l6 = [] -> int { return {}; };
constexpr auto l7 = [] -> auto { return 0; };
constexpr auto l8 = []<class...> {};
constexpr auto l9 = []<auto...> {};
constexpr auto l10 = []<auto...> mutable {};
constexpr auto l11 = []<auto...> noexcept {};
}