make_pair如何隐式推断出类型?

时间:2013-02-25 06:27:24

标签: c++ stl std-pair template-deduction

众所周知,make_pair推断出类型。这就是为什么它存在并且方便。 现在看到这个example

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

2 个答案:

答案 0 :(得分:4)

首先创建一个std::pair<double, char>,这要归功于帮助函数std::make_pair的类型推导,它创建了一对完全相同的类型,而不是传递给它您稍后将此对分配给哪个类型。

然后将此对象分配给std::pair<int,int>,感谢templated assignment operator。此运算符基本上允许可分配类型(U1T1U2T2),在内部为double分配int charintpair<int,int>

该语言没有“预测”将使用表达式的变量类型的功能,如果没有此步骤,则需要立即生成std::make_pair

如果你想避免那个步骤,你必须在构造时明确,这意味着你不应该使用类型扣除std::pair但是而是{{1}}的构造函数,它要求您放置显式类型。但是,我怀疑这会因优化而提高性能。

答案 1 :(得分: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分配给第二个

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