Ответ 1
почему это так Должна ли компилятор не возвращать ошибку в (2) и (3), как в (1)?
Это интересный вопрос.. и ответ на это еще интереснее.
В отправленном вами коде inner
есть имя типа. Это имя, которое объявлено как private
, а не сам тип 1 — доступность типа не имеет смысла в контексте С++; accessibilty относится только к имени — будь то имя типа, имя функции, имя данных. Поэтому, когда вы слышите что-то вроде "тип X является публичным классом", он почти всегда означает "имя X объявляется публичным, и оно относится к типу, а тип вездесущ, он существует повсюду".
Возвращаясь к тому, почему использование auto
не дает ошибки, хорошо, потому что, когда вы используете auto
, вы получаете доступ к типу без использования его имени, поэтому он не дает ошибки.
как я могу предотвратить возврат экземпляра частного внутреннего класса из внешних методов,
Нет способа.
1. struct { int data; }
- это тип, без имени для ссылки, но обратите внимание, что это не является допустимым объявлением, потому что ему не хватает имени. Либо вы должны объявить объект неназванного типа, как в struct { int data; } obj;
Или указать ему имя struct data_type { int data; };