- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
根据 [meta.rel](C++14 中的 20.10.6),对于类类型 T
, std::is_base_of<T,T>
是的,但对于内置类型 T
, std::is_base_of<T,T>
是假的。通俗地说,类类型是它们自己的基础,但内置类型不是。这种治疗差异的动机/效用是什么?
最佳答案
基本原理可以追溯到很久以前,并且没有很好的记录。
is_base_of
最初称为 is_base_and_derived
,并在 TR1 中引入。 Dave Abrahams 在 N1541 中引入了针对此类的问题。 ,编号 3.13:
Currently,
is_base_and_derived<X,Y>
returns false whenX
andY
are the same. This is technically correct (X
isn’t its own base class), but it isn’t useful. The definition should be loosened to return true whenX
andY
are the same, even when the type isn’t actually a class.
不幸的是,该问题没有说明为什么该定义没有用。然而,这种观点在当时(2003 年)并不是唯一的。 Andrei Alexandrescu's Modern C++ Design两年前发布的具有大致相同的特征,并且在第 2.7 节中关于其宏 SUPERSUBCLASS
的评论大致相同,不过如果你真的不希望一个类被认为是它自己的基类,本书还添加了一个变通方法宏。
Modern C++ Design继续使用SUPERSUBCLASS
在第 3.12 节中按继承顺序对 Typelist 进行排序。在这个练习的细节中,SUPERSUBCLASS(T, T)
是 true 被利用(为了方便实现)。
到 2004 年,TR1 report, N1647 , 采用了 std::is_base_of<T,T>::value == true
的概念在 T
时很有用是非 union 类类型。
N2255进一步阐明如何 is_base_of
应该适用于非类类型,而这种更改导致了您今天看到的措辞。然而,这篇被接受的论文提出的内容与以下草稿 (N2284) 中的内容之间存在广泛的编辑差异。我的看法是编辑大大改进了措辞。
为什么 N2255 的未记录理由在非 union 类类型和其他所有类型之间创建了一个划分是 is_base_of
历史上回答了有关类型继承层次结构的问题,只有一个方便的“技巧”,即可以通过“is-a”分析将类视为自己的基础。然而,根据该特性的多位作者的说法,不可能参与继承关系的类型不应该有资格作为基类。
这是否是最好的设计还有待商榷。但是,有足够的特征(例如 is_class
和 is_same
)可以根据这些基本特征构建您需要的任何东西。
这更像是一段历史,而不是直截了当的“为什么”。然而,这个答案的重点是指出 is_base_of
经过大量的迭代,在很长一段时间内进化。每次迭代都被认为是对以前的进化改进。
这一切都归结为:这是委员会认为最有用的规范。但随着规范和设计经过多年的发展,并经过几位作者的努力,不存在好的整体设计文档或基本原理。
关于c++ - 为什么当 T 是类类型时 std::is_base_of<T, T> 为真,而当 T 是内置类型时为假?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28665645/
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: Why can't Python handle true/false values as I expect?
我是不是遗漏了什么或者这是 ruby 中的错误? a = %w(foo bar baz) a.include? "foo" # => true a.size == 3
从 Modelica 文档来看,注释 Evaluate 似乎只对参数有影响: https://build.openmodelica.org/Documentation/ModelicaReferenc
为了避免嵌套的 if 语句并提高可读性,我想创建一个switch(true){ ... } Coldfusion 中的声明。我在 php 中经常使用这个,但是当我在 Coldfusion 中尝试这个时
嗨,我正在尝试处理 ajax json 响应 这是我的代码 success: function (j) { switch(true) { case (j.cho
我之前在我的 TF 代码中使用过这个: count = "${var.whatever == "true" ? 1 : 0}" 这非常适合我想要使用的东西。但是,我正在考虑如何最好地使用类似于说的
我之前在我的 TF 代码中使用过这个: count = "${var.whatever == "true" ? 1 : 0}" 这非常适合我想要使用的东西。但是,我正在考虑如何最好地使用类似于说的
这个问题在这里已经有了答案: How can I return pivot table output in MySQL? (10 个答案) 关闭 5 年前。 我正在尝试构建一个以唯一列值作为列名的表
我制作了一个简单的 JDialog,其中包含一个标签和一个按钮,它基本上相当于信息对话框。所以在对话框中,有一个方法 display() 我在其中调用了 setVisible(true) 五次。 据我
在 bash 4.2.8(1)-release (x86_64-pc-linux-gnu) 在 Ubuntu 11.04 上这个命令 [ $(wc -l /var/www/some.log|cut -
我正在使用 c 语言进行并发处理,我有一个进程池。为此,我让每个 child 都在一个 While (True) 循环中。为了杀死 child ,我正在使用一个全局变量和一个信号处理程序来修改它来打破
我正在尝试选择填写了字段的数据库条目。数据库有两种插入数据的方式,一种输入评论,一种不输入,我希望只选择填写了评论的行。 $requete = "SELECT * FROM daysoff WHER
如何在 JavaMail session 中setDebug(true) 捕获流并在我的日志记录框架中使用它? (缺少下载源代码,更改接受流作为参数的方法,重新编译它,...) 更一般地说,Java
我是 JavaScript 的新手,我刚刚发现了我无法理解的奇怪行为: var magicVar = Math.sin; magicVar == true; // it returns false m
对此感到困惑。 在两台服务器上运行相同版本的 MySQL。 (从完全相同的 rpm 构建)- 沿线的某个地方,一些开发人员改变了一些东西...... 服务器 1: mysql> select ( no
我在查看 OpenSSL 中使用的一些预处理器宏时,从 crypto/stack/safestack.h 中发现了以下内容: #define CHECKED_STACK_OF(type, p) \
所以我遇到了一个问题,我的正则表达式看起来像这样:/true|false/。 当我检查单词 falsee 时,我从这个正则表达式中得到一个 true,有没有办法将它限制为确切的 true 或 fals
我正在对这个恶意 JavaScript 行进行一些试验:var undefined = true; JavaScript 中每个未初始化的变量都有 undefined 的值,这只是一个保存特殊值 'u
我想将 PHP 的微时间存储为我在 MySQL 中的时间戳。 我去过told最好用 DECIMAL 存储它,但我找不到理想的大小。 有谁知道 microtime(true) 返回的最大大小是多少,所以
在 PHP 中,当您在 URL 中包含诸如“var=true”之类的内容时,URL 中的“true”和“false”是否被转换为 boolean 变量,或者它们是否等于文本“true”还是“假”?例如
我是一名优秀的程序员,十分优秀!