c – 是否应该在类模板定义中为this->限定的类/名称空间名称延迟名称查找?

clang 3.0和g 4.8.1都拒绝以下代码,注释中显示错误:

template<typename T>
struct S
{
    void f()
    {
        this->dependent(); // no error: type of 'this' is dependent?
        this->Dependent::dependent(); // error: 'Dependent' has not been declared
    }
};

根据[basic.lookup.classref]

the class-name-or-namespace-name following the . or -> operator is looked up both in the context of the entire postfix-expression and in the scope of the class of the object expression.

并且[temp.dep.expr]

this is type-dependent if the class type of the enclosing member function is dependent.

如果在对象表达式*的类的范围内查找类或命名空间名称Dependent,并且对象表达式的类是依赖的,那么在实例化模板之前是否应该延迟此查找?标准是否指定了正确的行为?

编辑:clang 3.0接受以下代码,但g 4.8给出与上面相同的错误

template<typename T>
struct S
{
    T m;
    void f()
    {
        m.dependent();
        m.Dependent::dependent();
    }
};

最佳答案 在您的第一个代码中,两行都是“格式错误,无需诊断”,因为“this”指的是当前实例化,但未找到任何成员且类模板没有依赖基类.

它既不是当前实例化的成员,也不是未知专业化的成员.见14.6.2.1p6

点赞