理解 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>
.
请注意,如果类型已包含 &
,则向其添加 &&
无效。因此,虽然 T
和 T &&
在这里是等效的,但 T &
不是。
这可以从 traits/concepts 根据 std::declval<T>()
定义的 returns T &&
.
中推断出来
std::declval<T &>()
returnsT &
的原因见reference collapsing.
我从 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>
.
请注意,如果类型已包含 &
,则向其添加 &&
无效。因此,虽然 T
和 T &&
在这里是等效的,但 T &
不是。
这可以从 traits/concepts 根据 std::declval<T>()
定义的 returns T &&
.
std::declval<T &>()
returnsT &
的原因见reference collapsing.