Herb Sutter在GotW#35中关于类型名称的代码玩笑是否过时?

lub*_*bgr 9 c++ typename

我读的文章周的老大师之一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() );
}
Run Code Online (Sandbox Code Playgroud)

我不明白 我的第一个猜测是,第二次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)。

int*_*jay 10

您对代码的理解是正确的。这里的笑话是对莎士比亚的《罗密欧与朱丽叶》中的台词的引用:

名字叫什么?我们称其为玫瑰的
鲜花,闻起来很香。

这通常被解释为“任何其他名称的玫瑰都会闻起来很甜”。

或在此代码的情况下:

A::Rose,无论使用任何其他类型的名称,都仍可以smell()打印"sweet"