我一直在玩内部课程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;
}
Run Code Online (Sandbox Code Playgroud)
这是编译在Linux clang++-3.5
和-std=c++14
.
在(1)中我得到了预期的编译器错误,因为它inner
是一个私有的内部类outer
.
但是,在(2)auto
中使用关键字时,编译成功并运行程序.
为什么会这样?我是否可以阻止从外部方法返回私有内部类的实例,同时保留在外部类中移动和/或复制它们的能力?
编译器不应该像在(1)中那样在(2)和(3)中引出错误吗?
c++ ×1