C++ 为什么在名称空间std之外声明type_info?

C++ 为什么在名称空间std之外声明type_info?,c++,stl,windows-ce,rtti,C++,Stl,Windows Ce,Rtti,我正在使用VS2005和STL的MS实现。但是,中的类类型_info在“namespace std”之外声明。这给第三方LIB带来了一些问题,除了查找std::type_info。为什么会这样,有什么解决办法吗?以下是typeinfo开头的示例: class type_info { ... }; _STD_BEGIN // = namespace std { 使用声明时,实际上有一个std::type_info。在某些情况下,它没有在std中定义这一事实可能是一个问题,但我想知道您是否遇

我正在使用VS2005和STL的MS实现。但是,中的类类型_info在“namespace std”之外声明。这给第三方LIB带来了一些问题,除了查找std::type_info。为什么会这样,有什么解决办法吗?以下是typeinfo开头的示例:

class type_info {
...
};


_STD_BEGIN // = namespace std  {

使用
声明时,实际上有一个
std::type_info
。在某些情况下,它没有在
std
中定义这一事实可能是一个问题,但我想知道您是否遇到过其中一个问题


你有什么问题

使用
声明时,实际上有一个
std::type_info
。在某些情况下,它没有在
std
中定义这一事实可能是一个问题,但我想知道您是否遇到过其中一个问题


你有什么问题

因为VisualStudio做了各种各样的技巧来允许遗留代码工作。IIRC,该标准仅规定
type_info
存在于
std
命名空间中。它并不要求它不存在于全局名称空间中——这实际上是一个实现决策


买主警告:我还没有在标准中验证这一点。

因为VisualStudio做了各种各样的技巧来允许遗留代码工作。IIRC,该标准仅规定
type_info
存在于
std
命名空间中。它并不要求它不存在于全局名称空间中——这实际上是一个实现决策


买主注意:我还没有在标准中验证过这一点。

这很有趣-标准确实这么说(17.4.1.1.库内容)

除宏、运算符new和运算符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中描述的行为

当然,标题
的描述表示它应该在名称空间
std
中(18.5类型标识):

标题
概要

namespace std {
    class type_info;
    class bad_cast;
    class bad_typeid;
}
因此
type_info
应该在
std
名称空间中(而不是在名称空间之外)。我猜这要么是一个bug,要么是在
std
名称空间之外有一些大型代码集(或小型重要代码集)需要它。我原以为他们会使用一些预处理器魔法来创建它,这样,如果需要,您可以强制它位于
std
命名空间中(或者反过来,默认情况下,将其设置为
std
,并允许宏或其他东西强制它位于全局命名空间中)

然而,
type\u info
的另一个折痕是它是
typeid
操作符的结果(更准确地说,是从
type\u info
派生的结果),因此可能对编译器对库需要与之一致的
typeid
操作符所做的工作有着严格的依赖性。因此
type_info
不在名称空间
std
中的事实可能是由于编译器对
typeid
表达式所做的操作,而库编写者可能对这一点几乎没有直接的控制(我想这就是为什么没有预印本解决问题的方法的原因之一)。如果有人比我更了解编译器的工作原理,那么他就必须更好地解释这一点(或者超越猜测)


但我认为你必须向微软(或PJ Plauger/Dinkumware)的人询问“为什么”的真正答案。

这很有趣-标准确实这么说(17.4.1.1.图书馆内容)

除宏、运算符new和运算符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中描述的行为

当然,标题
的描述表示它应该在名称空间
std
中(18.5类型标识):

标题
概要

namespace std {
    class type_info;
    class bad_cast;
    class bad_typeid;
}
因此
type_info
应该在
std
名称空间中(而不是在名称空间之外)。我猜这要么是一个bug,要么是在
std
名称空间之外有一些大型代码集(或小型重要代码集)需要它。我原以为他们会使用一些预处理器魔法来创建它,这样,如果需要,您可以强制它位于
std
命名空间中(或者反过来,默认情况下,将其设置为
std
,并允许宏或其他东西强制它位于全局命名空间中)

然而,
type\u info
的另一个折痕是它是
typeid
操作符的结果(更准确地说,是从
type\u info
派生的结果),因此可能对编译器对库需要与之一致的
typeid
操作符所做的工作有着严格的依赖性。因此
type_info
不在名称空间
std
中的事实可能是由于编译器对
typeid
表达式所做的操作,而库编写者可能对这一点几乎没有直接的控制(我想这就是为什么没有预印本解决问题的方法的原因之一)。如果有人比我更了解编译器的工作原理,那么他就必须更好地解释这一点(或者超越猜测)

但我想你得问问别人