c – 为什么for_each通过移动返回功能
我正在阅读std :: for_each这里
http://en.cppreference.com/w/cpp/algorithm/for_each的文档,看到返回值是std :: move(f)
为什么标准强制在返回值中移动输入参数?默认情况下不会移动它,因为输入参数是按值传递的吗? 当您编译以下代码时,这会引导我进行几次跟进 Something function(Something something) { return something; } > return语句是我的系统上具有最高优化级别(-O3)的移动,为什么大多数编译器都不会忽略此返回值?省略了本地值,但函数参数不是.. 我在我的Mac上的Apple LLVM版本8.0.0(clang-800.0.42.1)和Ubuntu 16.04的g 5.4上尝试了这个. 解决方法
这是由于C 11的移动语义规则的最新变化.当返回子句中出现按值函数参数时,The original move proposal不会自动移动.但是,在C 11流程的最后阶段,添加了该语言功能.
在添加语言功能之前,for_each“已被移动”.那时,返回声明的举动是必要的.但是,在C 11发货的时候,它变得没有必要了. LWG issue 2747对C 17进行了更正. 关于你的第一个后续问题,我不是编译器编写者,但我最好的猜测是:从功能参数(我知道的很多)中忽略返回目前是不合法的,我猜测为什么它不是合法的是,没有人知道如何实施它,因此没有人有动力改变标准使其合法化. 第二次跟进:不,C 17在这种情况下不强制执行.在这种情况下,规则与C 11保持相同,除了不再指定for_each的冗余移动这一事实. 从下面的评论:
我正在引用N4660,即C17,但在C 98/03/11/14中有类似的措辞……备份,它最近受到保护.见N4659(同样好): 15.8.3复制/移动省略[class.copy.elision]
这种语言特别禁止从功能参数中省略. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |