在阅读
gcc源代码中
std::pair
的实现时,我发现其中一个默认构造函数如下:
template<typename _T1, typename _T2>
struct pair
: public __pair_base<_T1, _T2>
{
typedef _T1 first_type; ///< The type of the `first` member
typedef _T2 second_type; ///< The type of the `second` member
_T1 first; ///< The first member
_T2 second;
...
template <typename _U1 = _T1,
typename _U2 = _T2,
typename enable_if<__and_<
__is_implicitly_default_constructible<_U1>,
__is_implicitly_default_constructible<_U2>>
::value, bool>::type = true>
constexpr pair()
: first(), second() { }
...
}
我的问题是,当使用默认的ctor构造对象时,也是实例化该类的对象的时候,如下所示:
std::pair<int, double> p;
_U1
与 _T1
有什么不同?谢谢你们。
不能。通过将构造函数模板参数
_U1
和 _U2
默认为类模板参数 _T1
和 _T2
,第三个(未命名)非类型模板参数存在替换失败的可能性。
这是当
_T1
或 _T2
不可隐式默认构造时,重载不可用的机制。