Bay*_*ita 7 c++ c++-concepts c++20
我有几个关于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>;
};
Run Code Online (Sandbox Code Playgroud)
问题是第二个要求的目的是什么,即
std::common_reference_with<
const std::remove_reference_t<LHS>&,
const std::remove_reference_t<RHS>&>
Run Code Online (Sandbox Code Playgroud)
谁能详细说明这个要求并提供一些例子吗?
如果上下文很重要,我会尝试从这篇文章中了解 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);
}
Run Code Online (Sandbox Code Playgroud)
但是,无论如何,我怀疑这是否是正确的使用方法assignable_from。
该common_reference_with要求基本上确保有一些通用的中间类型,通过它我们可以推断混合类型赋值的含义。它实现了赋值后“lhs等于rcopy”的语义要求,因为否则我们无法真正说出两个不同类型的值相等意味着什么。
此外,我们对概念给出的定义通常不是“可能的实现”。它们正是工作文件所说的内容。