为什么在命名空间std之外声明了type_info?

时间:2009-11-06 14:12:31

标签: c++ stl windows-ce rtti

我正在使用VS2005和STL的MS实现。但是,类type_info in在“namespace std”之外声明。这为第三方库创建了一些问题,除了找到std :: type_info之外。为什么会这样,是否有任何解决方法?以下是typeinfo开头的示例:

class type_info {
...
};


_STD_BEGIN // = namespace std  {

3 个答案:

答案 0 :(得分:3)

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

  

除了宏,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表达式所做的事情,并且库编写者可能几乎没有直接控制它(并且我' d猜测这就是为什么没有preprocssor解决方法的原因之一)。如果有更多关于编译器如何工作的人,我必须更好地解释这一点(或者超越推测)。

但我认为你必须要求微软(或PJ Plauger / Dinkumware)的某个人真正回答“为什么”。

答案 1 :(得分:1)

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

你的问题是什么?

答案 2 :(得分:0)

因为Visual Studio会执行各种技巧以允许遗留代码工作。 IIRC,标准仅声明type_info名称空间中存在std。它并不强制它不存在于全局命名空间内 - 这实际上是一个实现决策。

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