为啥 std::pair 对于 const 引用和转发引用参数有两个不同的构造函数?

Posted

技术标签:

【中文标题】为啥 std::pair 对于 const 引用和转发引用参数有两个不同的构造函数?【英文标题】:Why does std::pair have two different constructors for both const reference and forwarding reference parameter?为什么 std::pair 对于 const 引用和转发引用参数有两个不同的构造函数? 【发布时间】:2020-12-05 12:23:40 【问题描述】:

来自 ISO 标准(确切地说是 N4860)std::pair 概要:

constexpr explicit(see below) pair(const T1& x, const T2& y); // first constructor

template<class U1, class U2>
constexpr explicit(see below) pair(U1&& x, U2&& y); // second constructor

我似乎找不到任何理由说明第一个构造函数应该与完美转发构造函数一起定义。完美的转发构造函数还不足以处理复制、移动的情况吗?在哪种情况下,第一个构造函数会在重载决议中获胜?

【问题讨论】:

【参考方案1】:

在什么情况下第一个构造函数在重载决议中获胜?

当传递与 std::pair 的成员完全相同类型的 const 左值时,它获胜,即 const T1const T2。两个构造函数都是完全匹配的,非模板的会获胜。例如

const int i = 0;
const int j = 0;
std::pair<int, int> p(i, j);

从 C++11 开始添加了转发引用的构造函数,我认为第一个是为了保持一致性而保留的。

【讨论】:

以上是关于为啥 std::pair 对于 const 引用和转发引用参数有两个不同的构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

C++学习(四八三)无法从“std::pair<const _Kty,_Ty>”转换为“_Objty”

C++学习(四八三)无法从“std::pair<const _Kty,_Ty>”转换为“_Objty”

为啥 std::array<std::pair<int,int>, 3> 不能使用嵌套初始化列表初始化,但 std::vector<std::pair<int,in

返回 std::pair 与通过非常量引用传递

为啥 std::optional<int> 的构造比 std::pair<int, bool> 更昂贵?

我通过命名管道传输了一个 std::pair 它是如何工作的?