1

我正在使用 VS2005 和 STL 的 MS 实现。但是,类 type_info in 在“命名空间标准”之外声明。这给除了查找 std::type_info 的第三方库带来了一些问题。为什么会这样,有什么解决方法吗?这是 typeinfo 开头的示例:

class type_info {
...
};


_STD_BEGIN // = namespace std  {
4

3 回答 3

3

这很有趣 - 标准确实这么说(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)的某个人询问“为什么”的真正答案。

于 2009-11-06T14:59:51.513 回答
1

有了using声明,实际上,一个std::type_info. 可能存在未在内部定义它的事实std可能是一个问题,但我想知道您是否遇到过其中之一。

你怎么了?

于 2009-11-06T14:18:26.020 回答
0

因为 Visual Studio 使用各种技巧来允许遗留代码工作。IIRC,标准仅声明type_info存在于std命名空间中。它不要求它不存在于全局命名空间中——这实际上是一个实现决策。

警告 Emptor:我尚未在标准中验证这一点。

于 2009-11-06T14:23:33.187 回答