|
|
1
4
前言: 在下面的答案中,我提到C++ 98和C++ 03之间的一些区别。然而,事实证明,我所说的变化还没有达到标准,所以C++ 03在这方面与C++ 98没有什么不同(感谢Johannes指出这一点)。不知怎的,我确信我在C++ 03中看到了它,但实际上它并不存在。然而,这个问题确实存在(见Johannes评论中的Dr参考文献),一些编者已经实现了他们认为最合理的解决方案。因此,在下面的文本中引用C++ 03是不正确的。请解释引用C++ 03作为一些假设,但很有可能的未来规范的引用,这是一些编译器已经尝试实现的。 重要的是要注意,在C++ 98和C++ 03标准之间嵌套类的访问权限有显著的变化。 在C++ 98中,嵌套类没有对封闭类成员的特殊访问权限。它基本上是完全独立的类,只是在封闭类的范围内声明的。它只能访问 公众的 封闭类的成员。 在C++ 03中,嵌套类被赋予了封闭类成员的访问权限。 作为成员 封闭类的。更准确地说,嵌套类具有相同的访问权限 作为静态成员函数 封闭类的。也就是说,现在嵌套类可以访问 任何 封闭类的成员,包括 私有的 那些。 因此,您可能会观察到不同编译器和同一编译器的版本之间的差异,这取决于它们何时实现新规范。
当然,您必须记住,嵌套类的对象不会以任何方式绑定到封闭类的任何特定对象。就实际对象而言,这是两个独立的类。为了从嵌套类访问封闭类的非静态数据成员或方法,必须具有封闭类的特定对象。换句话说,嵌套类的行为确实与
静态成员函数
封闭类的:它没有特定的
一个简单的例子,说明C++ 98和C++ 03之间的区别如下
这一变化正是
|
|
|
2
2
简短回答:嵌套类可以访问C++ 0x中包含的类私有成员,而不是C++ 1998和C++ 2003。但是它是 合法的 对于C++ 98和C++ 2003,编译器支持C++ 0x行为,因为旧行为被认为是一个缺陷。 在C++ 98和2003标准中,第11章1节指出:
C++0X部分11.
Core Language Defect Report 45 显示原始行为被视为缺陷,因此非C++0x编译器也支持新行为是合法的,尽管这不是必需的。 |
|
|
3
1
按照标准:
要回答您的问题:
不,至少用
是有问题的。嵌套类也没有的实例
对。但是一定要检查文档是否符合标准。并且总是:在严格模式下使用一些编译器(如comeau)进行尝试。 |
|
|
4
1
我已经尽了最大努力将ISO/IEC 14882:1997中的所有相关条款汇编起来。 第9.7节:
11.2.1(应相当明显):
9.9嵌套类型名:
然后在11.8中:
由此我得出结论,你所经历的行为是不规范的。嵌套类不应该对基的私有成员具有任何“特殊”访问权。
然而,COMUC+,它似乎有最好的标准支持,具有与GCC相同的行为(允许)。
|
|
|
5
0
这不回答你的问题,但根据我读到的 the C++ FAQ Lite 24.6 你想做的事是不允许的。我不知道GCC为什么允许它;您在其他编译器中也尝试过它吗? |
|
Fernando Chu · 一个变量有多个可能的类?[关闭] 11 月前 |
|
|
Amaterastis · 基类接受子类和内部子类的模板参数 1 年前 |
|
|
Rishab Negi · 这个关键字在抽象类中是如何工作的 1 年前 |
|
|
dEmigOd · 类层次结构中的运算符重载解析 1 年前 |
|
|
TableTopRug · 如何从Kotlin中的密封类继承? 1 年前 |
|
|
hasdrubal · 抽象基类函数指针python 1 年前 |
|
|
Josh · 通过反思访问孩子的财产 1 年前 |