我在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
会将此作为编译错误捕获。有趣的是,如果你将Zede打字为int,那么VC++
就会抱怨。相当矛盾的行为。想法?
答案 0 :(得分:8)
正如其他人所说,这是由于Microsoft C ++扩展。虽然不推荐使用/Za
标志,因为它可以破坏事物。
相反,使用/permissive-
开关可以获得更好的标准合规性,并且您将在这些情况下获得健康的错误。请注意,此标志自VS 2017开始提供。
switch / Za不支持某些关键的Microsoft SDK头文件。相比之下,permissive-提供了一种有用的一致性模式,其中输入C ++代码根据ISO C ++规则进行解释,但也允许在Visual C ++支持的目标上编译C ++所需的符合扩展。
更多信息在Visual C++ Team Blog上。