它依赖于 std::string 的构造函数接受 const char* 的事实。std::string 的这个构造函数是否显式都没关系。模板扣除类型,使用pair的拷贝构造函数进行转换。对构造函数是否显式也无关紧要。
如果你把 std::string 的构造函数变成:
class string
{
public:
string(char* s)
{
}
};
你得到这个错误:
/usr/include/c++/4.3/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(const std::pair<_U1, _U2>&) [with _U1 = const char*, _U2 = int, _T1 = const string, _T2 = int]’:
foo.cpp:27: instantiated from here
/usr/include/c++/4.3/bits/stl_pair.h:106: error: invalid conversion from ‘const char* const’ to ‘char*’
/usr/include/c++/4.3/bits/stl_pair.h:106: error: initializing argument 1 of ‘string::string(char*)’
构造函数如下所示:
template<class _U1, class _U2>
pair(const pair<_U1, _U2>& __p)
: first(__p.first),
second(__p.second) { }
复制构造函数如下所示:
template<class _U1, class _U2>
pair(const pair<_U1, _U2>& __p)
: first(__p.first),
second(__p.second) { }