std :: map构造函数的奇怪用法

时间:2012-04-05 19:38:18

标签: c++ stl

我搜索了std :: map运行时排序的实现,并找到了这个解决方案: STL std::map dynamic ordering

我很清楚,但我不明白,如何在std :: map的构造函数中使用OrderingType。 std :: map有一个构造函数,它将一个比较器对象作为参数。因此,从我的观点来看,使用这样的代码是正常的:

int main()
{
   Ordering<int> test_ordering( ASCENDING );   
   CUSTOMMAP map1( test_ordering );

   return 0;
}

但是上面提到的主题的代码也会编译:

int main()
{
   CUSTOMMAP map1( ASCENDING );
   //...
   return 0;
}

我不明白,为什么它有效:std :: map的构造函数不能获取OrderingType枚举的参数而不是Ordering类对象本身。

1 个答案:

答案 0 :(得分:9)

如果Ordering<int>上带有枚举的构造函数未声明为explicit,则它被视为“转换构造函数”,当编译器需要转换时,它可以自动插入您的枚举类型为Ordering<int>类型。所以编译器实际上是这样做的:

CUSTOMMAP map1( ASCENDING );

并将其转化为:

CUSTOMMAP map1( Ordering<int>(ASCENDING) );

这称为隐式转化