ホームページ >バックエンド開発 >C++ >VS2010 では、非 Const 参照を右辺値にバインドできるのはなぜですか?

VS2010 では、非 Const 参照を右辺値にバインドできるのはなぜですか?

DDD
DDDオリジナル
2024-10-28 03:22:31639ブラウズ

Why Does VS2010 Allow Non-Const References to be Bound to Rvalues?

右辺値への非 const 参照のバインディング: VS2010 の異常

C では、一般的に非 const 参照を右辺値にバインドすることが考慮されます。エラーです。ただし、Visual Studio 2010 では、次のコードはエラーや警告なしでコンパイルされます。

<code class="cpp">string foo() { return "hello"; }
int main() 
{
    //below should be illegal for binding a non-const (lvalue) reference to a rvalue
    string& tem  = foo();   

    //below should be the correct one as only const reference can be bind to rvalue(most important const)
    const string& constTem = foo();   
}</code>

この動作は、GCC や VS2008 などの他のコンパイラと矛盾しており、そのようなコードではコンパイル エラーや警告が発生します。この矛盾により、VS2010 のバグであるかどうかについて疑問が生じています。

説明

この場合の VS2010 の動作は、VS コンパイラの既知の拡張機能に起因すると考えられます。 。歴史的に、これらのコンパイラは、明示的な const 修飾なしで、非 const 参照を右辺値にバインドすることを許可してきました。この動作はプログラマの便宜のために導入されたものであり、標準の C 機能とはみなされていません。

サンプル コードでは、VS2010 にエラーや警告がないことは次のように説明できます。

  • コンパイラは foo() の戻り値を右辺値として認識します。
  • string& tem 宣言を文字列への非 const 参照として解釈します。
  • ただし、 VS コンパイラの拡張機能を使用すると、foo() によって返される右辺値に参照をバインドできるようになります。

結論

許可する際の VS2010 の動作エラーや警告なしに右辺値にバインドされる非 const 参照は標準 C ではなく、拡張機能とみなされます。これは場合によっては便利ですが、予期しない動作を引き起こす可能性もあり、一般的には、右辺値へのバインドに const 参照を使用することはお勧めできません。

以上がVS2010 では、非 Const 参照を右辺値にバインドできるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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