3

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');

它是否会创建一对然后将其隐式强制转换doubleint和?charint

4

2 回答 2

4

它首先创建了一个std::pair<double, char>感谢帮助函数的类型推导,该函数std::make_pair创建了一对与您传递给它的类型完全相同的类型,无论您稍后将此对分配给哪种类型。

然后这个对象被分配给一个std::pair<int,int>可以工作的模板,这要归功于一个模板化的赋值运算符。该运算符基本上允许可分配类型(U1to T1U2to T2),它们在内部分配(在您的情况下) adouble到 anint和 achar到 an int

该语言没有“预测”将在其中使用表达式的变量类型的功能,这需要pair<int,int>立即进行,而中间没有这一步。

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

于 2013-02-25T06:32:03.233 回答
4

要详细说明克里斯的评论,请查看此

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 分配给 first 并将 other.second 分配给 second

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

于 2013-02-25T06:32:55.420 回答