Ответ 1
Если id-выражение является идентификатором функции-преобразования, , его идентификатор типа преобразования сначала просматривается в классе выражения объекта, а имя, если найдено, используется. В противном случае он рассматривается в контексте всего постфикс-выражение. В каждом из этих поисков рассматриваются только имена, которые обозначают типы или шаблоны, специализации которых являются типами. [Пример:
struct A { }; namespace N { struct A { void g() { } template <class T> operator T(); }; } int main() { N::A a; a.operator A(); // calls N::A::operator N::A }
- конец примера]
Это означает, что пример может быть точным, хотя в приведенном выше примере A
ранее был объявлен как имя типа, видимое для main
.
Это обсуждалось в основной проблеме 156, поданной полностью в 1999 году:
Как насчет:
struct A { typedef int T; operator T(); }; struct B : A { operator T(); } b; void foo() { b.A::operator T(); // 2) error T is not found in the context // of the postfix-expression? }
Правильно ли эта интерпретация? Или было намерением, что это будет ошибка только в том случае, если
T
было найдено в обеих областях и указано на разные объекты?Эрвин Унру: Цель заключалась в том, что вы смотрите в обоих контекстах. Если вы найдете его только один раз, этот символ. Если вы найдете его в обоих, оба символа должны быть "одинаковыми" в некотором отношении. (Если вы не нашли его, его ошибка).
Итак, я бы сказал, что Clang ошибочен: намерение, выраженное в некоторой формулировке, заключается в том, что мы находим T
, даже если только в классе.