为啥 GCC 说“不再支持命名返回值”?

Posted

技术标签:

【中文标题】为啥 GCC 说“不再支持命名返回值”?【英文标题】:Why does GCC say "named return values no longer supported"?为什么 GCC 说“不再支持命名返回值”? 【发布时间】:2010-11-22 14:36:34 【问题描述】:

我不小心把函数定义的左大括号放在了 return 语句之后

int id(int k) return k;  

但是 GCC 回答了一个奇怪的错误消息

错误:不再支持命名返回值

谁能解释一下这个奇怪的功能是什么?我从来没有听说过。

【问题讨论】:

也许是 NRVO 的一些早期实现,您必须命名变量以使其省略副本? Go 已命名结果参数,golang.org/doc/effective_go.html 【参考方案1】:

请参阅here - 通过在函数头中显式定义命名返回值来实现早期 NRVO。

添加了对没有此扩展的 NRVO 的原生支持 here - GCC 3.1 发布系列。

上下文的简要剪切和粘贴:

G++ 现在支持“命名返回 价值优化”:对于类似的代码

A f () 
  A a;
  ...
  return a;

G++ 将在返回中分配 a 值槽,这样返回就变成了 无操作。为此,所有返回 函数中的语句必须返回 同一个变量。

【讨论】:

NRVO 在我花了很长时间试图弄清楚为什么 VC++ 7.1(这是最后一个没有 NRVO 的 Microsoft C++)在返回大时如此缓慢@987654324 @结果... 在 VC++2008 中是不是也有一些东西,比如调试版本中没有 NRVO? @Matthieu - 这不会让我感到惊讶,调试 Visual C++ 普遍偏向于可调试性而不是性能(例如,参见“已检查的 STL”)。我只知道 NRVO 最早是在 VC8 中进入 Visual C++ 的。 这是一个古老的东西。至少可以追溯到 93 年 6 月的 2.4.5。在那个时候,g++ 中还有其他实验性的东西(我记得 min/max 运算符、go 接口的前身签名......)。【参考方案2】:

见here

他们是removed in gcc3.4

【讨论】:

【参考方案3】:

这是GCC extension、removed in GCC 3.4。

【讨论】:

以上是关于为啥 GCC 说“不再支持命名返回值”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们应该总是从函数返回值?

枚举很好用啊!为啥阿里不建议返回值用枚举??

枚举很好用啊!为啥阿里不建议返回值用枚举??

为啥 GCC 会警告这种隐式转换?

gcc编译线程程序,为啥要加-lpthread,头文件已经包含了<pthread.h>了啊

gcc编译线程程序,为啥要加-lpthread,头文件已经包含了<pthread.h>了啊