ホームページ > バックエンド開発 > C++ > C 11 の「auto」はいつ値または参照を推定しますか?

C 11 の「auto」はいつ値または参照を推定しますか?

Linda Hamilton
リリース: 2024-11-03 15:35:02
オリジナル
954 人が閲覧しました

When does `auto` in C  11 deduce a value or a reference?

C 11 の「auto」セマンティクスの微妙さ

C 11 では、auto キーワードは、初期化子に基づいて変数の型を自動的に推測する便利な方法を提供します。 。ただし、auto が値と参照のどちらに解決されるかについては、考慮すべき点があります。

ルールを理解する

ルールは簡単です。変数の宣言方法によって異なります。

<code class="cpp">int i = 5;
auto a1 = i;    // value
auto &a2 = i;  // reference</code>
ログイン後にコピー

最初のケースでは、a1 は参照として宣言されていないため、値になります。 2 番目のケースでは、a2 は明示的に 1 として宣言されているため参照です。

不確実性の明確化

このルールを指定した例に適用してみましょう:

  • auto p = get_foo();: get_foo() はスマート ポインターへの参照を返します。 p は参照なしで宣言されているため、コピーとなり、参照型オブジェクトになります。
  • auto sp = s_foo;: s_foo は、スマート ポインターへの静的参照です。 sp に代入すると、参照がコピーされ、参照型オブジェクトが生成されます。
  • for (auto foo: c): foo は、ベクトル内の各反復子のコピーになります。参照として宣言されていないためです。

テンプレート メタプログラミングによる証明

次のコードは、テンプレート メタプログラミングを使用したこの動作を示しています。

<code class="cpp">#include <typeinfo>
#include <iostream>

template< typename T >
struct A
{
    static void foo(){ std::cout << "value" << std::endl; }
};
template< typename T >
struct A< T&amp;>
{
    static void foo(){ std::cout << "reference" << std::endl; }
};

float& bar()
{
    static float t=5.5;
    return t;
}

int main()
{
    int i = 5;
    int &r = i;

    auto a1 = i;
    auto a2 = r;
    auto a3 = bar();

    A<decltype(i)>::foo();       // value
    A<decltype(r)>::foo();       // reference
    A<decltype(a1)>::foo();      // value
    A<decltype(a2)>::foo();      // value
    A<decltype(bar())>::foo();   // reference
    A<decltype(a3)>::foo();      // value
}</code>
ログイン後にコピー

出力:

value
reference
value
value
reference
value
ログイン後にコピー

これにより、auto の型が初期化子の型ではなく宣言によって決定されることが確認されます。

以上がC 11 の「auto」はいつ値または参照を推定しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート