我正在阅读文档std::for_each
here 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)但我不完全理解哪些情况符合强制省略的条件。
我试过这个Apple LLVM version 8.0.0 (clang-800.0.42.1)
在我的 Mac 及其他设备上g++ 5.4
在 Ubuntu 16.04 上。
这是由于 C++11 移动语义规则的最新更改所致。最初的搬迁提案当按值函数参数出现在 return 子句中时,不会自动移动。然而,到了 C++11 进程后期,该语言功能被添加了。
在添加语言功能之前,for_each
“被感动了”。当时对 return 语句的移动是必要的。但到 C++11 发布时,它变得不必要了,尽管它无害。
LWG 问题 2747针对 C++17 更正了此问题。
至于你的第一个后续问题,我不是编译器编写者,但我最好的猜测是:目前删除函数参数的返回是不合法的(我知道这么多),我猜测为什么它不合法不合法在于没有人弄清楚如何实施它,因此没有人有动力改变该标准以使其合法。
第二次跟进:不,C++17 在这种情况下不强制省略。在这种情况下,规则与 C++11 相同,除了从for_each
不再指定。
从下面的评论来看:
为什么说省略函数参数的返回是不合法的?
我正在参考N4660,也就是C++17,但是C++98/03/11/14中也有类似的写法……备份,最近已经被保护了。看N4659相反(同样好):
15.8.3 复制/移动省略 [class.copy.elision]
-
当满足某些条件时,允许实现省略类对象的复制/移动构造,...
- in a
return
在具有类返回类型的函数中声明,当表达是非易失性自动对象的名称(函数参数或由函数引入的变量除外)异常声明 of a handler(18.3)) 与函数返回类型具有相同的类型(忽略 cv 限定),可以通过将自动对象直接构造到函数调用的返回对象中来省略复制/移动操作
该语言明确不允许省略函数参数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)