为什么所有迭代器/迭代器适配器都不能在C++ 11中移动?

bil*_*llz 17 c++ iterator move-semantics c++11

这个问题中讨论了什么时候在C++ 11中创建一个不可移动的类型,我发现Scott Meyers在comp.std.c ++上有类似的问题,其中列出的类类型下面的SG在C++ 11中不可移动.

  • 所有互斥类型(recursive_mutex,timed_mutex,recursive_timed_mutex,
  • condition_variable
  • TYPE_INFO
  • error_category
  • 区域::小
  • random_device
  • seed_seq
  • 的reference_wrapper
  • 持续时间
  • 时间点
  • - 所有迭代器/迭代器适配器
  • 的ios_base
  • basic_istream ::哨兵
  • basic_ostream ::哨兵
  • 所有原子类型
  • once_flag

问题是为什么all iterators / iterator adaptors不能移动?

Pot*_*ter 14

该标准在批准标准之前一年就过时了.海报是DanielKrügler,一个活跃的委员会成员,这是一个政治游说:

这些都是不可动的,可能是偶然的,因为隐含生成的移动操作的规则在匹兹堡会议上得到澄清.一般的图书馆问题已经打开

http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1331

应对图书馆缺乏移动支持.请务必联系您的国家机构代表,因为我很遗憾这个问题不足以取代国家机构对FCD的评论.

换句话说,所有那些不可移动的类型都是标准的一个显示错误,他希望Usenet受众中的读者要求在标准成为正式之前解决问题.

该缺陷已移至 "已关闭"列表.决议是(为方便起见提供链接):

查看规范的库部分,并合并新添加的核心功能移动特殊成员功能(N3044).

由于N3044是一种大量的材料,因此很容易理解为什么这种基本功能必不可少.

迭代器,以及其他任何简单的值语义喜欢std::durationstd::time_point,当然是可移动的.正如其他人所提到的那样,可复制性意味着可移动性,如果不是,语言就会被打破.这个帖子当时没有错; 相反,它正在争论未完成语言的破碎.


MSa*_*ers 10

我认为你包括:"在不可移动类型列表中实现移动为普通复制的类"..迭代器被认为是轻量级对象,复制起来很便宜.为他们强制使用移动运算符是没有意义的.例如,std::vector<T>::iterator基本上只是一个包装T*,复制它们就像移动一样便宜.