众所周知,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
?
答案 0 :(得分:4)
首先创建一个std::pair<double, char>
,这要归功于帮助函数std::make_pair
的类型推导,它创建了一对完全相同的类型,而不是传递给它您稍后将此对分配给哪个类型。
然后将此对象分配给std::pair<int,int>
,感谢templated assignment operator。此运算符基本上允许可分配类型(U1
到T1
,U2
到T2
),在内部为double
分配int
char
和int
到pair<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分配给第二个
因此,任何类型的对都可以相互分配,只要基础类型是可分配的。