对于由this->限定的类/名称空间名称,应该延迟名称查找。在类模板定义中?

时间:2013-07-07 20:57:49

标签: c++ templates language-lawyer

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]

  

后面的class-name-or-namespace-name。或 - &gt;在整个后缀表达式的上下文和对象表达式的类的范围内查找运算符。

和[temp.dep.expr]

  如果封闭成员函数的类类型是依赖的,则

this依赖于类型。

如果在对象表达式* Dependent的类的范围内查找了class-or-namespace-name this,并且对象表达式的类是依赖的,那么这应该是在模板实例化之前,查找不会延迟?标准是否指定了正确的行为?

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

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

1 个答案:

答案 0 :(得分:2)

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

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