非const引用绑定到临时,Visual Studio错误?

时间:2013-05-05 02:59:18

标签: 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());
}

Visual studio让这一个飞。 gcc会将此作为编译错误捕获。有趣的是,如果你将Zede打字为int,那么VC++就会抱怨。相当矛盾的行为。想法?

1 个答案:

答案 0 :(得分:8)

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

相反,使用/permissive-开关可以获得更好的标准合规性,并且您将在这些情况下获得健康的错误。请注意,此标志自VS 2017开始提供。

  

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

更多信息在Visual C++ Team Blog上。