Per [meta.rel](C ++ 14中为20.10.6),对于类类型T
,std::is_base_of<T,T>
为真,但对于内置类型T
,std::is_base_of<T,T>
是假的。通俗地说,类类型是它们自己的基础,但内置类型不是。这种治疗差异的动机/效用是什么?
答案 0 :(得分:23)
理由可以追溯到很多方面,而且没有很好的记录。
is_base_of
最初称为is_base_and_derived
,并在TR1中引入。 Dave Abrahams在N1541中引用了一个针对这个类的问题,编号3.13:
目前,
is_base_and_derived<X,Y>
和X
时Y
返回false 是相同的。这在技术上是正确的(X
不是它自己的基础 类),但它没用。应该放宽定义 当X
和Y
相同时返回true,即使类型不相同也是如此 实际上是一个班级。
不幸的是,这个问题没有解释为什么这个定义没用。然而,这个观点在当时并不是唯一的(2003年)。两年前发布的Andrei Alexandrescu's Modern C++ Design具有相同的特征,并且在第2.7节中关于其宏SUPERSUBCLASS
的评论大致相同,尽管本书还添加了一个解决方法宏,如果你真的不想要一个类来被视为自己的基地。
Modern C++ Design继续使用3.12节中的SUPERSUBCLASS
按顺序排序Typelist。在本练习的细节深处,SUPERSUBCLASS(T, T)
为真的事实被利用(为了方便实施)。
到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_class
和is_same
)来构建这些基本特征所需的任何内容。
这更像是历史,而不是直截了当的“为什么”。然而,这个答案的重点是通过多次迭代来表明is_base_of
经过大量时间的演变。当时感觉每次迭代都是对以前的改进的进化改进。
这一切归结为:这是委员会认为最有用的规范。但是作为规范&amp;设计经过多年的发展,并且通过多位作者,没有良好的整体设计文件或理由。
答案 1 :(得分:2)
内置类型不是类,不属于类的东西不能是任何的基础。
如果有任何事情我感到有些惊讶,std::is_base_of<T,T>
即使对于班级类型也是如此,但是那可能是&#34;可以被视为&#34;阶级关系。