C の領域では、 auto の多用途性はしばしば好奇心を引き起こし、時には当惑さえ引き起こします。 auto をプライベート型で使用するときに、1 つの困惑した観察が生じます。
次のコード スニペットを考えてみましょう。これは驚くべきことにエラーなしでコンパイルされます。
class Foo { struct Bar { int i; }; public: Bar Baz() { return Bar(); } }; int main() { Foo f; auto b = f.Baz(); // ok std::cout << b.i; }
この型破りな動作により、次のような疑問が生じます。なぜ、直接アクセスが禁止されているのに、auto を介してプライベート型を使用しているのでしょうか?
この謎を解明するには、メカニズムを詳しく掘り下げる必要があります。自動。その型推論ルールは、C テンプレートのルールをほぼ反映しています。この観察は、前述のコード サンプルにも当てはまります。プライベート型のオブジェクトを引数としてテンプレート関数に渡すことができるのと同じように:
template <typename T> void fun(T t) {} int main() { Foo f; fun(f.Baz()); // ok }
また、auto を使用してその型を推測することもできます。これは、型名自体にはアクセスできないままでも、型情報は引き続き利用できるためです。これにより、プライベート型をクライアント コードに返すことが許可され、通常は禁止されていた auto.
によるアクセスが許可されます。以上が直接アクセスが禁止されているのに、「auto」がプライベート C 型にアクセスできるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。