【发布时间】: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