为什么标准强制在返回值中移动输入参数?默认情况下不会移动它,因为输入参数是按值传递的吗?
当您编译以下代码时,这会引导我进行几次跟进
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上尝试了这个.
解决方法
在添加语言功能之前,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]
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