加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 为什么for_each通过移动返回功能

发布时间:2020-12-16 03:45:58 所属栏目:百科 来源:网络整理
导读:我正在阅读std :: for_each这里 http://en.cppreference.com/w/cpp/algorithm/for_each的文档,看到返回值是std :: move(f) 为什么标准强制在返回值中移动输入参数?默认情况下不会移动它,因为输入参数是按值传递的吗? 当您编译以下代码时,这会引导我进行几
我正在阅读std :: for_each这里 http://en.cppreference.com/w/cpp/algorithm/for_each的文档,看到返回值是std :: move(f)

为什么标准强制在返回值中移动输入参数?默认情况下不会移动它,因为输入参数是按值传递的吗?

当您编译以下代码时,这会引导我进行几次跟进

Something function(Something something) {
    return something;
}

> return语句是我的系统上具有最高优化级别(-O3)的移动,为什么大多数编译器都不会忽略此返回值?省略了本地值,但函数参数不是..
>在这种情况下,C 17是否会强制执行?我阅读了提案(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0135r0.html),但我不完全了解哪些案件符合强制性省略的条件.

我在我的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的冗余移动这一事实.

从下面的评论:

Why do you say it’s not legal to elide the return from a function parameter?

我正在引用N4660,即C17,但在C 98/03/11/14中有类似的措辞……备份,它最近受到保护.见N4659(同样好):

15.8.3复制/移动省略[class.copy.elision]

  1. When certain criteria are met,an implementation is allowed to omit the copy/move construction of a class object,…

    • in a return statement in a function with a class return type,when the expression is the name of a non-volatile automatic object (other than a function parameter or a variable introduced by the exception-declaration of a handler (18.3)) with the same type (ignoring cv-qualification) as the function return type,the copy/move operation can be omitted by constructing the automatic object directly into the function call’s return object

这种语言特别禁止从功能参数中省略.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读