I've got a few questions about std::assignable_from
behavior. Cppreference suggests the following implementation for it:
template< class LHS, class RHS >
concept assignable_from =
std::is_lvalue_reference_v<LHS> &&
std::common_reference_with<
const std::remove_reference_t<LHS>&,
const std::remove_reference_t<RHS>&> &&
requires(LHS lhs, RHS&& rhs) {
{ lhs = std::forward<RHS>(rhs) } -> std::same_as<LHS>;
};
The question is what is the purpose of the second requirement, i.e.,
std::common_reference_with<
const std::remove_reference_t<LHS>&,
const std::remove_reference_t<RHS>&>
Could anyone elaborate this requirement and provide some examples on it?
If the context matters, I'm trying to learn about C++20 concepts from this post. My question is related to one specific example from it:
template <typename D, std::integral T>
requires std::assignable_from<D, T>
void assign_the_thing(D& dest, T&& x)
{
dest = std::forward<T>(x);
}
However, I doubt if this is a right way to use assignable_from
, anyway.