Обоснование возможной реализации std :: assignable_from - PullRequest
4 голосов
/ 09 февраля 2020

У меня есть несколько вопросов о std::assignable_from поведении. Cppreference предлагает следующую реализацию для него:

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>;
  };

Вопрос в том, какова цель второго требования, т. Е.

std::common_reference_with<
    const std::remove_reference_t<LHS>&,
    const std::remove_reference_t<RHS>&>

Может кто-нибудь уточнить это требование и привести несколько примеров по нему?

Если контекст имеет значение, я пытаюсь узнать о концепциях C ++ 20 из этого поста . Мой вопрос связан с одним конкретным примером c из него:

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);
}

Тем не менее, я сомневаюсь, что в любом случае это правильный способ использования assignable_from.

1 Ответ

3 голосов
/ 10 февраля 2020

Требование common_reference_with в основном обеспечивает наличие некоторого общего промежуточного типа, с помощью которого мы можем рассуждать о значении присваивания смешанного типа. Это позволяет требование семантики c, что после присваивания "lhs равно rcopy", потому что в противном случае мы не можем действительно сказать, что означает, что два значения разных типов равны.


Кроме того, определение, которое мы даем для понятий, обычно не является «возможной реализацией». Это именно то, что написано в рабочем документе.

...