非常量引用绑定到临时,Visual Studio的错误?

我在编译gcc一些可移植代码时遇到了这个问题。 基本上这个奇怪的代码在Visual Studio中编译,这实际上只是打动了我的脑海:

 class Zebra {int x;}; Zebra goo() {Zebra z; return z;} void foo(Zebra &x) { Zebra y; x = y; foo(goo()); } 

Visual studio让这个飞行。 gcc将捕获这个作为编译错误。 有趣的是,如果你把Zebrainputint, VC++会报错。 相当矛盾的行为。 思考?

这是Visual Studio的旧扩展,我能在Microsoft网站上find的唯一参考是这个错误报告: 临时对象可以绑定到非常量引用 ,它具有以下示例代码:

 struct A {}; A f1(); void f2(A&); int main() { f2(f1()); // This line SHALL trigger an error, but it can be compiled without any errors or warnings. } 

其中一个答复指出:

有一个4级警告(如果你传递/ W4到编译器启用4级警告)

这个博客文章: Visual C ++是如此自由 ,它涵盖了这个扩展注意到:

使用禁用语言扩展(/ Za)使其成为一个错误:

正如其他人所说,这是由于Microsoft C ++扩展。 虽然/Za国旗不推荐,因为它可以打破东西。

相反,使用/permissive-开关更好的标准兼容性,你会得到这些情况下的健康错误。 请注意,此标志自VS 2017起可用。

开关/ Za不支持某些关键的Microsoft SDK头文件。 通过对比/ permissive-提供了一种有用的一致性模式,其中input的C ++代码根据ISO C ++规则进行解释,但也允许在Visual C ++支持的目标上编译C ++所需的一致扩展。

更多信息在Visual C ++团队博客上 。