ホームページ >バックエンド開発 >C++ >Visual Studio で一時ファイルへの非 Const 参照バインドが許可されるのはなぜですか?

Visual Studio で一時ファイルへの非 Const 参照バインドが許可されるのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-24 09:55:25916ブラウズ

Why Does Visual Studio Allow Non-Const Reference Binding to Temporaries?

一時オブジェクトへの非定数参照のバインドに関する 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。