gpt4 book ai didi

c++ - GotW #35 中关于 typename 的 Herb Sutter 代码笑话是否已过时?

转载 作者:可可西里 更新时间:2023-11-01 16:36:41 26 4
gpt4 key购买 nike

我正在阅读 typename 上的一篇旧 Guru of the Week 文章, #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由于一些你很容易忽略的事情而被实例化(这个笑话应该是关于什么的,否则?!)。但是这两个调用都会导致打印出“sweet”。毕竟,这不是可以预料的吗?在 typedef Rose rose; , Rose不是从属名称,所以没关系。在 typedef typename T::rose foo; , rose是相关的,但是 typename减轻了。我的问题:

  1. 这段代码有什么意义?我在这里缺少幽默感吗?
  2. 文章来自 1998 年;是否有任何语言变化改变了这段代码的作用?

Here是 Godbolt 上的代码片段的浓缩版。我测试了每个看起来很旧的编译器(例如 gcc-4.4.1 ,但请注意,上面的代码片段仍然比 gcc-4.4.1 早 11 年)。

最佳答案

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

What's in a name? That which we call a rose
By any other name would smell as sweet;

这通常被解释为“任何其他名字的玫瑰闻起来都一样甜。”

或者对于这段代码:

A::Rose, by any other type name, would still make smell() print "sweet".

关于c++ - GotW #35 中关于 typename 的 Herb Sutter 代码笑话是否已过时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56792139/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com