Я читал одну из старых статей Гуру недели на typename
, # 35 .В самом конце вы можете найти следующий фрагмент:
#include <iostream>
using std::cout;
using std::endl;
struct Rose {};
struct A { typedef Rose rose; };
template<class T>
struct B : T { typedef typename T::rose foo; };
template<class T>
void smell( T ) { cout << "awful" << endl; }
void smell( Rose ) { cout << "sweet" << endl; }
int main() {
smell( A::rose() );
smell( B<A>::foo() );
}
Я не понимаю этого.Мое первое предположение состояло в том, что второй вызов smell
привел к созданию шаблона smell
из-за чего-то, что вы легко упускаете из виду (в чем суть шутки, в противном случае ?!).Но оба звонка приводят к распечатке «сладкого»И разве этого не следовало ожидать, в конце концов?В typedef Rose rose;
, Rose
не является зависимым именем, так что это нормально.В typedef typename T::rose foo;
, rose
зависит, но typename
смягчает это.Мой вопрос (ы):
- Какой смысл в этом фрагменте?Мне здесь не хватает чувства юмора?
- Статья написана в 1998 году;Были ли какие-либо языковые изменения, которые изменяют то, что делает этот код?
Здесь - это сокращенная версия фрагмента кода Godbolt.Я тестировал каждый компилятор, который выглядел старым (например, gcc-4.4.1
, но учтите, что приведенный выше фрагмент все еще на 11 лет старше gcc-4.4.1
).