The STL types std::pair and std::tuple can both store reference types. However their constructors cannot adequately check if the initialization of reference types is safe. For example:
std::tuple<std::tuple<int> const&> t = 42; // The stored reference is already dangling.
Libc++ has a best effort attempts in tuple to diagnose this, but they're not able to handle all valid cases (If I'm not mistaken). For example initialization of a reference from the result of a class's conversion operator. Libc++ would benefit from having a builtin traits which can provide a much better implementation.
This patch introduce the __reference_binds_to_temporary(T, U) trait that determines whether a reference of type T bound to an expression of type U would bind to a materialized temporary object.
Note that the trait simply returns false if T is not a reference type instead of reporting it as an error.
static_assert(__is_constructible(int const&, long)); static_assert(__reference_binds_to_temporary(int const&, long));