Я играл с внутренними классами в C++
, и сейчас я немного запутался.
Мой код:
#include <iostream>
class outer{
private:
class inner{
private:
int something;
public:
void print(){
std::cout<< "i am inner"<<std::endl;
}
};
public:
inner returnInner(){
inner i;
return i;
}
};
int main(){
outer o;
//outer::inner i = o.returnInner(); (1)
//auto i = o.returnInner(); (2)
//i.print();
o.returnInner().print(); //(3)
return 0;
}
Это скомпилировано в Linux с помощью clang++-3.5
и -std=c++14
.
-
В (1) я получаю ошибку компилятора как ожидалось, потому что
inner
является частным внутренним классомouter
. -
Однако в (2), когда используется ключевое слово
auto
, компиляция выполнена успешно и программа запускается. - Все работает для (3).
Мой вопрос:
Почему это так? Могу ли я предотвратить возврат экземпляра частного внутреннего класса из внешних методов, сохраняя при этом возможность перемещать и/или копировать их во внешнем классе?
Не следует ли компилятору вызывать ошибку в (2) и (3), как в (1)?