クラス内でプライベート型を操作するとき、興味深い状況に遭遇することがあります。変数に型名を使用するとエラーが発生します。'auto' を使用して型を推測すると機能するようです
class Foo { struct Bar { int i; }; public: Bar Baz() { return Bar(); } };
指定されたコードでは、Foo にプライベートのネストされた型 Bar が含まれています。次の行を実行するとエラーがスローされます:
Foo::Bar b = f.Baz(); // error
予期せぬことに、'auto' を使用すると問題が解決されます:
auto b = f.Baz(); // ok
なぜこれが許可されているのですか?
「自動」型推論とテンプレート型推論はどちらも、同様の基礎メカニズムを共有します。この例では、「テンプレート」関数がプライベート タイプでどのように機能するかに似ています。
template <typename T> void fun(T t) {} int main() { Foo f; fun(f.Baz()); // ok }
アクセシビリティの公開
プライベート タイプのオブジェクトを渡す機能テンプレート関数を使用するか、「auto」を使用してその型を推論するのは、名前が非表示であっても型自体はアクセス可能なままであるという事実に由来します。コンパイラは、型推論を通じてオブジェクトの構造を解明し、その利用を可能にします。
したがって、プライベート型の名前にはアクセスできませんが、その型情報は依然として利用可能であり、「auto」などのメカニズムを介した操作が可能です。 ' またはテンプレート推定。
以上が明示的な宣言が失敗するのに、「auto」がプライベート型で機能するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。