C 11 では、auto キーワードは、初期化子に基づいて変数の型を自動的に推測する便利な方法を提供します。 。ただし、auto が値と参照のどちらに解決されるかについては、考慮すべき点があります。
ルールは簡単です。変数の宣言方法によって異なります。
<code class="cpp">int i = 5; auto a1 = i; // value auto &a2 = i; // reference</code>
最初のケースでは、a1 は参照として宣言されていないため、値になります。 2 番目のケースでは、a2 は明示的に 1 として宣言されているため参照です。
このルールを指定した例に適用してみましょう:
次のコードは、テンプレート メタプログラミングを使用したこの動作を示しています。
<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
これにより、auto の型が初期化子の型ではなく宣言によって決定されることが確認されます。
以上がC 11 の「auto」はいつ値または参照を推定しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。