理解 C++ move_constructible 概念实现

understanding c++ move_constructible concept implementation

我从 cppreference

获得了以下 C++ 概念 move_constructible 的实现
template<typename _Tp>
concept move_constructible =
    constructible_from<_Tp, _Tp> &&
    convertible_to<_Tp, _Tp>;

我不明白为什么会这样。我假设任何类型都可以转换为自身,所以第二个要求毫无意义(天哪,我一定是错了)。此外,对于第一个要求,我会期望像 constructible_from<_Tp, _Tp&&> 这样的东西来检查类型是否可以从 rvalue-ref 构造(因此,移动)。

请解释此实现的工作原理。

大多数 traits/concepts 自动将 && 添加到“源”参数的类型(传递给函数的东西,如 std::is_invocable,或从中构建,如 std::is_constructible).

constructible_from<A, B> 等同于 constructible_from<A, B &&>&& 自动添加到第二个参数,而不是第一个),convertible_to<A, B> 等同于 convertible_to<A &&, B>.

请注意,如果类型已包含 &,则向其添加 && 无效。因此,虽然 TT && 在这里是等效的,但 T & 不是。


这可以从 traits/concepts 根据 std::declval<T>() 定义的 returns T &&.

中推断出来

std::declval<T &>()returnsT &的原因见reference collapsing.