在C ++中,对象的常量是通过迭代器转发的。如果std::begin(a)
不是const,A::iterator
通常会返回a
,如果A::const_iterator
是const,则a
会返回。
我试图将此概念扩展到移动行为,以便获得更好的通用代码。基本思想是这样的:
struct A {
using value_type = std::string;
using iterator = AIter<A>;
using const_iterator = AIter<A const>;
using move_iterator = AIter<A &&>;
iterator begin() &;
iterator end() &;
const_iterator begin() const &;
const_iterator end() const &;
move_iterator begin() &&;
move_iterator end() &&;
};
template <typename A> struct AIter {
using a_type = A;
using value_type = typename std::decay_t<A>::value_type;
using reference = std::conditional_t<
std::is_rvalue_reference_v<A>, value_type &&,
std::conditional_t<std::is_const_v<std::remove_reference_t<A>>,
value_type const &, value_type &>>;
};
这有点令人费解,尤其是迭代器中的条件类型。概念仅仅是,迭代器的类型完全取决于A
的引用类型。
不幸的是,当我尝试使用std::begin
和std::end
(以及所有类似的函数)而不是直接使用成员函数时,会出现问题,因为它们并非旨在在< em>完美转发的方式。 Here如果要进行测试,可以在编译器资源管理器上找到一个小型演示。
鉴于目前的情况,我的意思是:
std::begin(std::move(a))
这样的东西(您通常使用std::make_move_iterator
来做到这一点),但是在通用代码中,我认为使用std::begin(std::forward<A>(a))
可能有用……或者没有?.begin()
方法或执行完美转发的自定义免费功能会更好吗?到编译器资源管理器的链接中类似的内容。编辑:Nelfeal发现this other question与我的关系密切。