也许我对 [class.access]/7 的理解不正确,但是
Maybe my understanding of [class.access]/7 isn't correct, but
从[class.access]/7我们得到以下句子:
类似地,使用
A::B
作为基说明符也是格式良好的因为D
是从A
派生的,所以必须检查基说明符s直到看到整个基说明符列表为止。
class A {
protected:
struct B { };
};
struct D: A::B, A { };
看看clang的实例。事实上,clang也抱怨这个片段,因为它不需要延迟。
class A {
protected:
struct B { };
};
struct D: A, A::B { };
为什么这个代码不编译?
PS:gcc和VS21013也不编译代码。
这只是一个编译器错误。该标准的规范性文本支持该示例。事实上,多个编译器都有相同的错误,这意味着这是标准的一部分,很难纠正。
GCC对此存在公开的错误和叮当声。注意,一些相关的案例实际上是C++03和C++11之间的细微差异,但据我所知,不是这一个。
[class.access]/1.2仅表示
protected
;也就是说,它的名称只能由声明它的类的成员和朋友、从该类派生的类以及他们的朋友使用(见11.4(
11.4没有对此进行扩展。您在从该类A
派生的类D
中使用名称B
。没关系。
我认为这是clang的一个错误。Ideone也不接受该代码:http://ideone.com/uiFl9L:
class A {
protected:
struct B { };
};
struct D: A::B, A { };
我检查了gcc-5.1.0、gcc-4.9和clang-3.7(rc2(。标准明确指出这是一个良好的格式(见问题(,因此编译器有问题。
示例明确了[class.access]/6:
第11条中的所有访问控制都会影响从特定实体,包括所声明实体名称之前的声明部分。。。
这意味着,根据[class.access]/2,一个类可以访问所有基类,甚至在它们被声明之前。
相关文章:
- 使用2个键的cpp-stl::优先级队列排序不正确
- 正弦级数方程计算不正确
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 密码登录程序将永远循环并显示不正确的结果
- 在C++中返回不正确的楼层函数值
- 形状对象的旋转和缩放不正确C++
- C++ 读取文件读取文件不正确
- 关于类的 Python 文档 - 对C++的引用不正确
- 特征 LLT 模块给出不正确的结果?
- glibcxx STL 在实现 std::valarray::sum() 时是否不正确?
- 如果语句逻辑不正确
- 来自逆 vp 矩阵和相机位置的光线方向不正确
- 不正确的操作数类型 MSVC
- 数组填充了不正确的值
- 我是否不正确地集中了这些字符数组?
- 为什么除非我使用 cout,否则我的值不正确?
- 计算幂级数的数学结果不正确
- 为什么 sizeof 在 C++ 中给出不正确的字节数?
- atoi() 在应用于大型命令行参数时会产生不正确的值
- 也许我对 [class.access]/7 的理解不正确,但是