24

我在编译一些可移植代码时遇到了这个问题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会将其捕获为编译错误。有趣的是,如果你 typedef Zebra 为 int,VC++会报错。相当矛盾的行为。想法?

4

2 回答 2

24

这是 Visual Studio 的旧扩展,我可以在 Microsoft 网站上找到的唯一参考是这个错误报告:Temporary Objects Can be Bound to Non-Const References,它具有以下示例代码:

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++ is so Liberal涵盖了这个扩展,它指出:

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

于 2013-12-31T04:24:46.587 回答
10

正如其他人所说,这是由于 Microsoft C++ 扩展。虽然/Za不推荐使用标志,因为它会破坏事物。

相反,使用/permissive- 开关来更好地符合标准,您将在这些情况下得到健康的错误。请注意,此标志自 VS 2017 起可用。

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

更多信息见Visual C++ 团队博客

于 2017-10-23T08:53:51.770 回答