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*).它没有.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> - 因为必要的类型是可转换的,这是有效的.
| 归档时间: |
|
| 查看次数: |
1779 次 |
| 最近记录: |