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 サイトの他の関連記事を参照してください。