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

C++ 绑定到临时Visual Studio错误的非常量引用?,c++,visual-studio,temporary-objects,C++,Visual Studio,Temporary Objects,我在gcc中编译一些可移植代码时遇到了这个问题。基本上,这段奇怪的代码是在Visual studio中编译的,这让我大吃一惊: class Zebra {int x;}; Zebra goo() {Zebra z; return z;} void foo(Zebra &x) { Zebra y; x = y; foo(goo()); } visualstudio让它飞起来gcc会将此作为编译错误捕获。有趣的是,如果您将def Zebra键入int,VC++会抱怨

我在
gcc
中编译一些可移植代码时遇到了这个问题。基本上,这段奇怪的代码是在Visual studio中编译的,这让我大吃一惊:

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

visualstudio
让它飞起来
gcc
会将此作为编译错误捕获。有趣的是,如果您将def Zebra键入int,
VC++
会抱怨。相当矛盾的行为。想法?

这是对Visual Studio的旧扩展,我在Microsoft站点上找到的唯一参考是以下错误报告:,其中包含以下示例代码:

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级警告)

本博文:涵盖此扩展的博文指出:

使用禁用语言扩展(/Za)会导致错误:


正如其他人所说的,这是由于微软C++扩展。虽然不建议使用
/Za
标志,因为它会破坏东西

相反,使用
/permissive-
开关可获得更好的标准遵从性,在这些情况下,您将得到健康的错误。请注意,该标志自2017年起可用

开关/Za不支持某些关键的Microsoft SDK头文件。通过对比/允许-提供一种有用的一致性模式,其中输入C++代码根据ISOC++规则解释,但也允许在VisualC++中支持C++的目标上编译C++所需的一致扩展。
有关详细信息,请参见。

这不是一个bug,而是一个编译器扩展,而且是一个邪恶的扩展。MSVC确实有
警告C4239:使用了非标准扩展
,但很明显,您已经关闭了该警告。我不明白您为什么需要使用无限递归函数来演示此功能。可能值得注意的是,
/permissive
标志自VS 2017起就可用。您可以通过包含文章中的相关引用来改进这个答案。就像is所做的一样,引入的原因及其与
/Za