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

Ant*_*lev 3 c++ stl

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

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

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

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

int main()
{
   CUSTOMMAP map1( ASCENDING );
   //...
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*eek 9

如果上面的构造函数Ordering<int>未将您的枚举声明为explicit,那么它被认为是一个"转换构造函数",当编译器需要从枚举类型转换为类型时,它可以自动插入Ordering<int>.所以编译器实际上是这样做的:

CUSTOMMAP map1( ASCENDING );
Run Code Online (Sandbox Code Playgroud)

并将其转化为:

CUSTOMMAP map1( Ordering<int>(ASCENDING) );
Run Code Online (Sandbox Code Playgroud)

这称为隐式转换.