当基类是依赖类型时,这是一个缺陷吗
Is it a defect when the base class is a dependent type
考虑标准中的一个示例
示例
template<class T> struct A {
typedef int M;
struct B {
typedef void M;
struct C;
};
};
template<class T> struct A<T>::B::C : A<T> {
M m; // OK, A<T>::M
};
评论说M
指的是A<T>::M
,我对此表示怀疑,因为这些规则:
温度dep#3
在类或类模板的定义中,在非限定名称查找期间,无论是在类模板或成员的定义点,还是在类模板和成员的实例化期间,都不会检查依赖基类的范围。
这意味着在非限定名称查找过程中永远不会考虑依赖基类范围内的名称。
名称M
是非限定名称。因此,不考虑在A<T>
中声明的M
。
然后根据不合格名称查找规则,即:
basic.lookup.uqual#8
对于类X的成员,在成员函数体、默认参数、noexcept说明符、非静态数据成员的大括号或等号初始值设定项中,或在X定义之外的类成员定义中,在成员声明符-id32之后使用的名称应以下列方式之一声明:
- 如果X是类Y的嵌套类,应是Y的成员,或应是Y基类的成员(此查找反过来适用于Y的封闭类,从最内部的封闭类开始(
由于
C
是B
的嵌套类,因此我认为查找应从B
开始,然后从A
开始,因为B
的范围中有一个名称M
,因此应停止查找。在〔basic.lookup.uqual〕中列出的所有情况下,将按每个类别中列出的顺序搜索范围以查找声明;一旦找到名称的声明,名称查找就结束。如果找不到声明,则表示程序格式不正确。
因此,根据这些规则,
A<T>::B::C
中的名称M
应指B::M
。结果就在这里。
GCC同意标准的说法,但
clang
报告了一个错误,并表示类型M
是void
。CCD_ 18的结果与我的分析一致。基于这些原因,我同意clang
是正确的。所以,我想知道这是一个缺陷吗?或者我误解了什么?
根据Clang的C++缺陷报告支持,目前(2020-07-06(Clang没有实现CWG591的解决方案,其中添加了带有依赖基类定义的段落和您在问题中引用的示例。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '