make_pair是如何隐式推导类型的

How does make_pair deduce the types implicitly?

本文关键字:类型 何隐式 pair make      更新时间:2023-10-16

众所周知,make_pair推导类型。这就是它存在的原因,它很方便。现在看这个例子:

std::pair <int,int> foo;
std::pair <int,int> bar;
foo = std::make_pair (10,20);
bar = std::make_pair (10.5,'A'); //ok: implicit conversion from pair<double,char>

现在,我想了解上一行中的扣除时间:

bar = std::make_pair (10.5,'A');

它是否创建了一对,同时隐式地将double强制转换为int,将char强制转换为int

它首先创建了一个std::pair<double, char>,这要归功于助手函数std::make_pair的类型推导,它创建了一对与您传递给它的类型完全相同的类型,无论您后来将这对类型分配给哪种类型。

然后,该对象被分配给std::pair<int,int>,该CCD_8由于模板化的赋值运算符而起作用。此运算符基本上允许可分配类型(U1T1U2T2(,这些类型在内部将double分配给int,将char分配给CCD16。

该语言没有"预测"将使用表达式的变量类型的功能,这是在没有这一步骤的情况下立即生成pair<int,int>所必需的。

如果您想避免该步骤,则在构造对时必须显式,这意味着您不应该使用扣除std::make_pair的类型,而应该使用std::pair的构造函数,该构造函数要求您放置显式类型。然而,我怀疑这是否会因为优化而提高性能。

要详细了解chris的评论,请查看此

bar = std::make_pair (10.5,'A');

与相同

std::pair <double,char> myPair = std::make_pair (10.5,'A'); 
bar = myPair;

最后一行现在使用下面的分配运算符

template< class U1, class U2 >
pair& operator=( const pair<U1,U2>& other );

将other.first分配给第一个,将other.second分配给第二个

因此,只要底层类型是可赋值的,任何类型的对都可以相互赋值。