模板类继承层次中重复成员名为何未触发Clang警告?
为什么Clang对模板类继承中的成员阴影不触发-Wshadow-field警告?
这是因为Clang的-Wshadow-field警告默认不会检查依赖基类(dependent base class)中的成员,而模板类继承里的P<E>就属于依赖基类——它的类型依赖于模板参数E。
C++模板遵循两阶段查找规则:
- 第一阶段(模板定义时):编译器只会处理不依赖模板参数的名称,依赖基类的成员属于依赖名称,此时编译器不会去解析它们,自然也不会检测阴影问题。
- 第二阶段(模板实例化时):编译器才会解析所有依赖名称,但默认的
-Wshadow-field并没有在这个阶段启用对模板场景的检查。
如果你想在模板实例化时也触发成员阴影警告,可以启用Clang的-Wshadow-field-in-template选项。用这个选项编译你的模板代码:
clang++ -Wshadow-field -Wshadow-field-in-template your_code.cpp
就会得到类似非模板场景的警告:
warning: non-static data member 'a' of 'C<double>' shadows member inherited from type 'P<double>' [-Wshadow-field-in-template]
这个Clang特有的选项正好能满足你重构时的需求——避免遗忘删除子类成员导致父子类出现同名变量的问题。
内容的提问来源于stack exchange,提问作者user997112
相关产品推荐
相关产品推荐

