C++ 未设置lambda返回类型时std::transform中的附加副本

C++ 未设置lambda返回类型时std::transform中的附加副本,c++,gcc,c++17,copy-elision,C++,Gcc,C++17,Copy Elision,我在gcc 7.3和c++17中遇到了以下代码示例: 为什么Y的第二个副本(在转换中)会发生?我可以通过将一元lambda的返回类型设置为引用来消除它 -> auto const & 我认为lambda操作符()和/或copy省略的内联性质会处理“无用”的拷贝 编辑:正如Barry所解释的,答案是标准禁止复制省略函数参数的返回。函数参数没有复制省略(请参阅Emphasis mine): 这种复制/移动操作的省略称为复制省略,在以下情况下是允许的(可以组合使用以消除多个副本):

我在gcc 7.3和c++17中遇到了以下代码示例:

为什么Y的第二个副本(在转换中)会发生?我可以通过将一元lambda的返回类型设置为引用来消除它

-> auto const &
我认为lambda操作符()和/或copy省略的内联性质会处理“无用”的拷贝


编辑:正如Barry所解释的,答案是标准禁止复制省略函数参数的返回。

函数参数没有复制省略(请参阅Emphasis mine):

这种复制/移动操作的省略称为复制省略,在以下情况下是允许的(可以组合使用以消除多个副本):

  • 在具有类返回类型的函数中的
    return
    语句中,当表达式是具有相同类型(忽略cv限定)的非易失性自动对象(而不是函数参数或处理程序([except.handle])的异常声明引入的变量)的名称时作为函数返回类型,可以通过将自动对象直接构造到函数调用的返回对象中来省略复制/移动操作

lambda是琐碎的和内联的这一事实并不重要——该副本不是省略的候选对象。当然,如果编译器可以确定它可以根据“仿佛”规则删除副本,它可以这样做——但在这种情况下它不能,因为该副本肯定有副作用

可能重复:为什么要在此处应用复制省略?提示:
[](Y const&Y){return Y;}
的返回类型是
Y
,而不是
Y const&
。为什么可能重复?由于巴里解释的原因,我没有抄袭省略。对我来说,这似乎是一个与你所联系的问题不同的答案
construct Y  
copy Y  
begin transform  
copy Y  
construct X  
move X
-> auto const &