C 11 で \'auto\' を使用する場合、変数が参照であるか値であるかはどのように判断されますか?

Susan Sarandon
リリース: 2024-11-04 11:24:02
オリジナル
1000 人が閲覧しました

When using

C 11 "auto" 型推定: 参照と値の解決

C 11 では、"auto" キーワードが便利な方法を提供します変数の型を自動的に推定します。ただし、「auto」を使用する場合は、値と参照のどちらに解決されるかを決定するルールを理解することが重要です。

「auto」の型推定ルール:

基本的なルールは、「auto」は変数が表す型ではなく、変数自体の宣言を解釈するということです。したがって、次の例は、「auto」が値に解決されることを明確に示しています:

<code class="cpp">auto i = v.begin(); // Copy, as begin() returns an iterator by value</code>
ログイン後にコピー

ただし、より複雑なシナリオでは、区別があまり明確ではない可能性があります。次の例を考えてみましょう:

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

この場合、「auto」は次から型を推測します。 get_foo() 関数の戻り値の型。std::shared_ptr への参照です。 p の宣言では単一のアンパサンド (&) が使用されているため、参照ではなく コピー に解決されます。

  • ケース 2: 静的変数 - コピーまたは参照?
<code class="cpp">static std::shared_ptr<Foo> s_foo;
auto sp = s_foo; // Copy or reference?</code>
ログイン後にコピー

ここで、「auto」は、静的な std::shared_ptr である s_foo の宣言から型を推定します。 sp の宣言にはアンパサンドがないため、再び copy に解決されます。

  • ケース 3: コンテナーのループ - 反復ごとにコピー?
<code class="cpp">std::vector<std::shared_ptr<Foo>> c;
for (auto foo: c) { // Copy for every loop iteration?</code>
ログイン後にコピー

この場合、「auto」はベクトルの反復子の型から型を推定します。イテレータは、参照型である std::shared_ptr を返します。ただし、foo の宣言ではアンパサンド (&) が使用されているため、std::shared_ptrコピー である 逆参照 値に解決されます。

結論:

「auto」型推定のルールは簡単です。変数自体の宣言に従います。参照に解決するには、宣言でアンパサンドを使用します (auto &ref = ...)。それ以外の場合、「auto」は値の型を推測します。

以上がC 11 で \'auto\' を使用する場合、変数が参照であるか値であるかはどのように判断されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!