【发布时间】:2015-07-02 12:47:32
【问题描述】:
我一直在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)。
我的问题:
为什么会这样?我可以防止从外部方法返回私有内部类的实例,同时保留在外部类中移动和/或复制它们的能力吗?
编译器不应该像 (1) 中那样在 (2) 和 (3) 中引发错误吗? p>
【问题讨论】:
-
如果
inner不应该从外部访问,为什么returnInner然后指定public? -
我认为它是为了表现这种奇怪的行为。
-
@AndyG 有,但我会重新格式化以使其更清晰
-
@KunaPrime 这是一个很棒的第一个问题。欢迎来到 SO!
-
您可以阻止复制和移动到
outer类之外,但您不能阻止例如当不涉及创建副本时绑定到引用。
标签: c++