make_pair是如何隐式推导类型的
How does make_pair deduce the types implicitly?
众所周知,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由于模板化的赋值运算符而起作用。此运算符基本上允许可分配类型(U1
到T1
,U2
到T2
(,这些类型在内部将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分配给第二个
因此,只要底层类型是可赋值的,任何类型的对都可以相互赋值。
相关文章:
- 防止主数据类型C++的隐式转换
- 逐位操作的隐式类型转换
- C ++中无符号位长度类型之间的隐式转换,即uint8_t,uint16_t
- 如何在参数中定义隐式类型转换的构造函数?
- 隐式可转换参数,但属于引用类型
- C++隐式构造函数转换,后跟类型向上转换
- 允许对具有相同基础结构的类型进行隐式强制转换
- 为什么我可以阻止基元的隐式转换,而不是用户定义类型的隐式转换
- 带有非类型参数的调用模板函数明确和类型参数隐式
- C++中从用户定义类型到基元类型的隐式转换
- 除当前类型外,可用于从Base派生的所有类型的隐式构造函数
- 从int到类类型的隐式转换
- C++ 为什么要使用从 (std::string) 到 (void) 类型的隐式转换
- 无法将 List 中的类型 'uint' 隐式转换为'T'(从类模板)
- 不允许复制构造函数,但允许从其他类型进行隐式复制
- 是否可以定义基元类型的隐式强制转换行为?C++
- 开关条件中从类到枚举类型的隐式转换
- 从类类型到类类型的隐式转换
- 如何防止使用多种整数类型的boost::变体类型的隐式转换
- 函数和冲突类型的隐式声明- AVR