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これをコンパイルエラーとしてキャッチします。興味深いことに、Zebra を int に typedef すると、エラーが発生します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.
}

回答の1つは次のように述べています。

レベル 4 の警告があります (コンパイラに /W4 を渡すと、レベル 4 の警告が有効になります)。

このブログ投稿: Visual C++ is so Liberal では、この拡張機能について次のように説明されています。

Disable Language Extensions (/Za) を使用するとエラーになります。

于 2013-12-31T04:24:46.587 に答える