Prior Art
C++: noexcept(noexcept(β¦))
C++'s noexcept(noexcept(β¦)) pattern is used to declare something as noexcept
if the evaluated pattern is also noexcept. This makes noexcept conditional
on the pattern provided.
This is most commonly used in generic templates to mark the output type as
noexcept if all of the input types are noexcept as well.
C++: implicits and constexpr
constexpr can be applied based on a condition. The following example works:
C++ 11
template <
class U = T,
detail::enable_if_t<std::is_convertible<U &&, T>::value> * = nullptr,
detail::enable_forward_value<T, U> * = nullptr>
constexpr optional(U &&u) : base(in_place, std::forward<U>(u)) {}
template <
class U = T,
detail::enable_if_t<!std::is_convertible<U &&, T>::value> * = nullptr,
detail::enable_forward_value<T, U> * = nullptr>
constexpr explicit optional(U &&u) : base(in_place, std::forward<U>(u)) {}
C++ 20
template <
class U = T,
detail::enable_forward_value<T, U> * = nullptr>
explicit(std::is_convertible<U &&, T>::value) constexpr optional(U &&u) : base(in_place, std::forward<U>(u)) {}
todo: validate what this does exactly by someone who can actually read C++.
Rust: maybe-async crate
Rust: fn main
Rust provides overloads for async fn main through the Termination trait. The
main function can optionally be made fallible by defining -> Result<()> as
the return type. In the ecosystem it's common to extend fn main with async
capabilities by annotating it with an attribute. And this mechanism has been
shown to work in the compiler as well by implementing Termination for F: Future.
The mechanism of overloading for fn main differs from what we're proposing,
but the outcomes are functionally the same: greater flexibility in which
function modifiers are accepted, and less need to duplicate / wrap code.
Zig: async functions
Zig infers whether a function is async, and allows async/await on non-async functions, which means that Zig libraries are agnostic of blocking vs async I/O. Zig avoids function colors.
β Zig contributors, βZig In-Depth Overview: Concurrency via Async Functions,β October 1, 2019
Swift: async overloading
// Existing synchronous API
func doSomethingElse() { ... }
// New and enhanced asynchronous API
func doSomethingElse() async { ... }
- https://github.com/apple/swift-evolution/pull/1392