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

Linda Hamilton
リリース: 2024-11-02 21:52:30
オリジナル
438 人が閲覧しました

When Does

C 11 の「auto」セマンティクスを理解する

C 11 では、「auto」キーワードにより自動型推論が可能になります。ただし、値に解決されるか参照に解決されるかの判断は、場合によっては曖昧になることがあります。

型推定ルール:

「auto」の型推定のルールは単純です。 : これはオブジェクトの宣言方法に基づいています。

たとえば:

<code class="cpp">int i = 5;</code>
ログイン後にコピー

次のように宣言すると、

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

a1 は値の型として差し引かれます。 (int)、a2 は参照型 (int&) として差し引かれます。

曖昧なケース:

次の例を考えてみましょう:

<code class="cpp">const std::shared_ptr<Foo>& get_foo();
auto p = get_foo(); // Copy or reference?</code>
ログイン後にコピー

get_foo は参照を返しますが、p は「auto」として宣言されています。この場合、auto は p の型が Foo への参照であると推定します。

<code class="cpp">static std::shared_ptr<Foo> s_foo;
auto sp = s_foo; // Copy or reference?</code>
ログイン後にコピー

s_foo は Foo への共有ポインターの静的インスタンスです。 sp は「auto」を使用して宣言されているため、Foo への共有ポインタとして推定されます。

<code class="cpp">std::vector<std::shared_ptr<Foo>> c;
for (auto foo: c) { // Copy for every loop iteration?</code>
ログイン後にコピー

ここで、「auto」はベクトルを反復処理し、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&& >
{
    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
ログイン後にコピー

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

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