对于[meta.rel](在C++ 14中为20.10.6),对于类类型Tstd::is_base_of<T,T>为true,但是对于内置类型Tstd::is_base_of<T,T>为false。通俗地讲,类类型是它们自身的基础,但内置类型不是。这种治疗差异的动机/效用是什么?

最佳答案

基本原理可以追溯到很久以前,并且没有得到充分的记录。
is_base_of最初称为is_base_and_derived,并在TR1中引入。戴夫·亚伯拉罕(Dave Abrahams)在N1541(编号3.13)中针对此类提出了一个问题:



不幸的是,这个问题并没有说明为什么该定义没有用。但是,当时的观点并不独特(2003年)。两年前发布的Andrei Alexandrescu's Modern C++ Design具有几乎相同的特征,并且在第2.7节中对其宏SUPERSUBCLASS进行了几乎相同的注释,尽管如果您确实不希望将类视为自己的基础,则本书还添加了一种替代方法宏。

Modern C++ Design继续使用3.12节中的SUPERSUBCLASS来按继承顺序对Typelist进行排序。在本练习的详细内容中,利用了SUPERSUBCLASS(T, T)为true的事实(为实现方便)。

到2004年,TR1 report, N1647接受了一个概念,即当std::is_base_of<T,T>::value == true是非联盟类类型时,T很有用。

N2255进一步阐明了is_base_of对于非类类型应该如何工作,并且此更改导致了您今天所看到的措词。但是,此接受的论文提出的内容与以下草案(N2284)产生的内容之间存在巨大的编辑差异。我的意见是,编辑极大地改善了措辞。

N2255为何在非联盟类类型与其他所有类型之间建立划分的原因尚未公开,其原因是is_base_of历史上回答了有关类型继承层次的问题,只有一个方便的“窍门”,即可以通过“is-a”分析。但是,根据该特性的多位作者的说法,那些不可能参与继承关系的类型永远都不应被视为基类。

那是否是最好的设计尚待争论。但是,有足够的特征(例如is_classis_same)可以根据这些基本特征构建所需的内容。

这更多是历史,而不是简单的“为什么”。但是,此答案的重点是要指出is_base_of经过许多次迭代是经过大量时间演变而成的。当时感觉到每次迭代都是对以前的改进。

归结为:这是委员会认为最有用的规范。但是随着规范和设计的发展以及经过数位作者的多年发展,目前尚无良好的总体设计文档或原理。

关于c++ - 为什么当T为类类型时std::is_base_of <T,T>为true,而当T为内置类型时为何为false?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28665645/

10-11 22:38
查看更多