make_pair如何知道其args的类型?

bob*_*obo 3 c++ stdmap std-pair

MSVC++"实用程序"标头中make_pair的定义是:

template<class _Ty1,
 class _Ty2> inline
 pair<_Ty1, _Ty2> make_pair(_Ty1 _Val1, _Ty2 _Val2)
 { // return pair composed from arguments
 return (pair<_Ty1, _Ty2>(_Val1, _Val2));
 }

我一直使用make_pair,但将参数类型放在尖括号中:

    map<string,int> theMap ;

    theMap.insert( make_pair( "string", 5 ) ) ;

我不应该告诉make_pair第一个论点是std::string不是char*

怎么知道的?

Pot*_*ter 12

函数模板调用通常可以make_pair<…>通过参数推导避免显式模板参数(即),这由C++03§14.8.2定义.摘抄:

引用函数模板特化时,所有模板参数都必须具有值.可以明确指定值,或者在某些情况下,从使用中推断出值.

具体的规则有点复杂,但只要你只有一个通常足够合格的专业化,它通常只是"正常".

您的示例使用两个演绎步骤和一个隐式转换.

  • make_pair返回一个pair<char const*, int>,
  • 然后template<class U, classV> pair<string,int>::pair( pair<U,V> const & )开始U = char*, V = int并执行成员初始化,
  • 调用string::string(char*).


Edw*_*nge 9

它没有.make_pair生成了一对<char*,int>(或者可能是一对<char const*,int>).

但是,如果你在对的实现中注意到有一个模板化的复制构造函数:


template < typename Other1, typename Other2 > 
pair(pair<Other1,Other2>& other) 
  : first(other.first), second(other.second)
{}
Run Code Online (Sandbox Code Playgroud)

这可以以稍微不同的方式实现,但是相同的事情.由于这个构造函数是隐式的,编译器会尝试在你的对<char*,int>中创建pair <std :: string,int> - 因为必要的类型是可转换的,这是有效的.