我正在使用 VS2005 和 STL 的 MS 实现。但是,类 type_info in 在“命名空间标准”之外声明。这给除了查找 std::type_info 的第三方库带来了一些问题。为什么会这样,有什么解决方法吗?这是 typeinfo 开头的示例:
class type_info {
...
};
_STD_BEGIN // = namespace std {
我正在使用 VS2005 和 STL 的 MS 实现。但是,类 type_info in 在“命名空间标准”之外声明。这给除了查找 std::type_info 的第三方库带来了一些问题。为什么会这样,有什么解决方法吗?这是 typeinfo 开头的示例:
class type_info {
...
};
_STD_BEGIN // = namespace std {
这很有趣 - 标准确实这么说(17.4.1.1. Library contents)
除了宏、operator new 和 operator delete 之外的所有库实体都定义在命名空间 std 内或嵌套在命名空间 std 内的命名空间内。
并明确表示(5.2.8 类型识别)
typeid 表达式的结果是静态类型 const std::type_info (18.5.1) 和动态类型 const std::type_info 或 const name 的左值,其中 name 是从 std::type_info 派生的实现定义的类,它保留18.5.1 中描述的行为。
Ans,当然,标题的描述<typeinfo?>
表明它应该在命名空间中std
(18.5类型标识):
标题
<typeinfo>
概要namespace std { class type_info; class bad_cast; class bad_typeid; }
所以type_info
应该在std
命名空间中(而不是在它之外)。我猜这要么是一个错误,要么是在std
命名空间之外有大量代码(或一小部分重要代码)需要它。我原以为他们会使用一些预处理器魔法来制作它,以便您可以根据需要强制它位于std
名称空间中(或相反 -std
默认情况下将其放入并允许宏或其他东西将其强制到全局命名空间)。
然而,另外一个问题type_info
是它是typeid
运算符的结果(更准确地说,派生的东西type_info
是结果),因此可能紧密依赖于编译器对typeid
运算符所做的操作,库需要与之保持一致。type_info
因此,不在命名空间中的事实std
可能是由于编译器对typeid
表达式所做的事情,而库编写者可能对此几乎没有直接控制权(我猜这就是为什么没有针对该问题的预处理器解决方法的原因之一)。比我更了解编译器如何工作的人必须更好地解释这一点(或超越猜测)。
但我认为您必须向 Microsoft(或 PJ Plauger/Dinkumware)的某个人询问“为什么”的真正答案。
有了using
声明,实际上,有一个std::type_info
. 可能存在未在内部定义它的事实std
可能是一个问题,但我想知道您是否遇到过其中之一。
你怎么了?
因为 Visual Studio 使用各种技巧来允许遗留代码工作。IIRC,标准仅声明type_info
存在于std
命名空间中。它不要求它不存在于全局命名空间中——这实际上是一个实现决策。
警告 Emptor:我尚未在标准中验证这一点。