一時オブジェクトへの非定数参照のバインドに関する Visual Studio の奇妙なケース
一時オブジェクトへの非定数参照のバインドに対する Visual Studio の動作が問題となっています。その一見矛盾した性質のため、一部のプログラマの間で眉をひそめる人もいます。コンテキストを理解するには、次のコード スニペットを検討してください。
class Zebra {int x;}; Zebra goo() {Zebra z; return z;} void foo(Zebra &x) { Zebra y; x = y; foo(goo()); }
驚くべきことに、gcc がエラーとして識別している間、Visual Studio ではこのコードのコンパイルが許可されています。この現象により、多くの人が Visual Studio のアプローチの背後にある理論的根拠について疑問を抱いています。
詳しく調べると、Visual Studio では古い言語拡張機能が採用されていることがわかりました。 Microsoft のバグ レポートはこの問題を明らかにし、Visual Studio では一時オブジェクトを非 const 参照にバインドできることを強調しています。ただし、この動作は、言語拡張機能を無効にする /Za コンパイラ オプションを使用することで修正できます。
この拡張機能をさらに詳しく説明するには、次のコードを検討してください。
struct A {}; A f1(); void f2(A&); int main() { f2(f1()); // This line triggers an error with `/Za` enabled }
回避策として, Visual Studio は、このような場合に備えてレベル 4 の警告をサポートしており、コンパイル中に /W4 を指定することでアクティブ化できます。ただし、このアプローチでもコードをコンパイルできるため、Visual Studio の拡張機能の柔軟性が強調されることは注目に値します。
以上がVisual Studio で一時ファイルへの非 Const 参照バインドが許可されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。