c++ - std::assignable_from 可能实现背后的基本原理

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

我有一些关于 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 的正确方法。

最佳答案

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

<小时/>

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

关于c++ - std::assignable_from 可能实现背后的基本原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60138440/

相关文章:

c++ - 从多维数组返回一个数组

c++ - 在概念约束中使用变量模板会产生编译错误

C++ 20 概念接受随机访问容器但拒绝 std::list

c++ - 为什么两个函数不会产生二义性?

c++ - "integral"类型的函数重载

c++ - 需要帮助矢量化此代码

c++ - C++标准库中有算术类型的概念吗?

c++ - 使用类成员函数初始化 std::barrier

c++ - 为什么概念 c++ 中没有前向声明?

c++ - 为什么 std::span 缺少 cbegin 和 cend 方法?