4

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]

. 后面的类名或命名空间名。or -> 操作符在整个后缀表达式的上下文和对象表达式的类范围内查找。

和 [temp.dep.expr]

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

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

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

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

1 回答 1

2

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

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

于 2013-07-10T09:28:14.203 回答