非常量引用绑定到临时,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 ++团队博客上 。