为什么来自非依赖基类的非限定名称比模板参数更受青睐

Nat*_*mal 6 c++ templates language-lawyer

C++ 标准规定,来自非依赖基类的非限定名称优于模板参数。这背后的原因是什么?

以下片段来自 C++ 模板:

#include <iostream>

template <typename X>
class Base {
    public:
        int basefield;
        using T = int;
};

class D1 : public Base<Base<void>> {
    public:
        void f() { basefield = 3; // works as normal 
        }
};

template <typename T>
class D2 : public Base<double> {
    public:
        void f() { basefield = 7; }
        T strange;  // what type am I ???
};

int main() {
    D2<std::string> d;
    d.strange = 100;
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*ing 2

非限定查找大约相当于在每个包含范围中尝试限定查找并保留第一个命中。由于D2<\xe2\x80\xa6>::Tcan find Base<double>::T,因此在 class\xe2\x80\x99s 范围内的查找成功;该查找自然先于在类外部按词法引入的模板参数的查找。

\n

此首选项还避免了在之间出现不合格的名称更改含义

\n
template<class T>\nstruct A : B {\n  Z z;\n  void f();\n  // \xe2\x80\xa6\n};\n
Run Code Online (Sandbox Code Playgroud)\n

\n
template<class Z>\nvoid A<Z>::f() {\n  Z z;\n  // \xe2\x80\xa6\n}\n
Run Code Online (Sandbox Code Playgroud)\n

尽管命名空间范围名称仍然可以进行相同的更改。

\n

也就是说,即使委员会在这一特定规则上也存在分歧,因为与在template-head中看到的名称相比,更喜欢在基类中看到的名称\xe2\x80\x99t 是很奇怪的。

\n