Является ли шутка Херба Саттера в GotW # 35 на имя типа устаревшей? - PullRequest
9 голосов
/ 27 июня 2019

Я читал одну из старых статей Гуру недели на 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 смягчает это.Мой вопрос (ы):

  1. Какой смысл в этом фрагменте?Мне здесь не хватает чувства юмора?
  2. Статья написана в 1998 году;Были ли какие-либо языковые изменения, которые изменяют то, что делает этот код?

Здесь - это сокращенная версия фрагмента кода Godbolt.Я тестировал каждый компилятор, который выглядел старым (например, gcc-4.4.1, но учтите, что приведенный выше фрагмент все еще на 11 лет старше gcc-4.4.1).

1 Ответ

10 голосов
/ 27 июня 2019

Ваше понимание кода верно.Шутка здесь - отсылка к строке из ромео и Джульетты Шекспира:

Что в названии?То, что мы называем розой
любым другим именем, будет пахнуть сладко;

Это часто перефразируется как "Роза под любым другим именем пахнет сладко".

Или в случае этого кода:

A::Rose, с любым другим именем типа, все равно будет smell() print "sweet".

...