【问题标题】:The rationale behind std::assignable_from possible implementationstd::assignable_from 可能实现背后的基本原理
【发布时间】:2023-04-08 06:22:01
【问题描述】:

我有几个关于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>&>

谁能详细说明此要求并提供一些示例?

如果上下文很重要,我正在尝试从this post 学习 C++20 概念。我的问题与其中的一个具体示例有关:

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 的正确方法。

【问题讨论】:

  • @NicolBolas 抱歉,我不明白。目前尚不清楚在 Eric Niebler 所描述的情况下,common_reference_with 的结果是什么,以及它与赋值运算符的关系如何。
  • common_reference_with... 要求意味着无意义的结果:here。在这个示例代码中,assignable_from 失败,因为 B 可转换为 A,而 A 可转换为 B。所以至少,这个概念的名称具有误导性。
  • swappable_with 概念也有同样的错误!!但它在 TS 中是最糟糕的。

标签: c++ c++20 c++-concepts


【解决方案1】:

common_reference_with 要求基本上确保存在一些常见的中间类型,通过它我们可以推断混合类型赋值的含义。它实现了赋值后“lhs 等于rcopy”的语义要求,因为否则我们无法真正说出不同类型的两个值相等意味着什么。


此外,我们对概念的定义通常不是“可能的实现”。它们正是工作文件所说的。

【讨论】:

  • 不同类型的两个值可以相等,例如,如果它们的关联类型是相同类别的两种不同表示。在这种情况下,类型 A 可转换为 B,而 B 可转换为 A。这种对称可转换性的结果是 assignable_from 将失败……这是没有意义的。
  • @T.C.,谢谢你的回答!不幸的是,我仍然不清楚。现在我还有更多问题。您说相等检查需要公共中间类型。我真的看不出它有什么帮助。它是平等要求的某种替代品吗?如果不是,那么如何用公共引用类型来表示相等检查?为什么使用const std::remove_reference_t&lt;LHS&gt;&amp; 而不是const LHS&amp;。为什么我们必须使common_reference_with 参数const-qualified?
猜你喜欢
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 2014-12-19
相关资源
最近更新 更多