лязг 3.0 и г ++ 4.8.1 и отвергают следующий код с ошибкой, показанной в комментарии:Должен ли поиск имени отложить для класса/namespace-name, присвоенного этим-> в определении шаблона класса?
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]
имя-класса или -namespace-name, следующее за. или -> отображается как в контексте всего постфиксного выражения, так и в области класса выражения объекта.
И [temp.dep.expr]
this
является типом-зависимым, если тип класса вмещающего функции члена зависит.
Если--пространство имен имя класса или Dependent
ищется «в области видимости класса выражения объекта * this
, и класс выражения объекта зависит, не следует этот поиск не может быть отложен до тех пор, шаблон создается? Указывает ли стандарт на правильное поведение?
EDIT: лязг 3,0 принимает следующий код, но г ++ 4.8 дает ту же ошибку, как выше
template<typename T>
struct S
{
T m;
void f()
{
m.dependent();
m.Dependent::dependent();
}
};
Я не вижу, как 'this-> Dependent :: dependent()' может быть зависимым выражением. Как это зависит от параметра шаблона? – mfontanini
[temp.dep.expr] "' this' зависит от типа, если тип класса функции-член-член зависит ". – willj
Второй код делает ощущение, поскольку оно может зависеть от шаблона, но не первого. Для меня как первый, так и второй код компилируются отлично на clang3, g ++ 4.8.1 и msvc_110, если, конечно, я не пытаюсь создать экземпляр первого кода –