c++ - make_pair 如何隐式推断类型?

标签 c++ stl std-pair template-argument-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

最佳答案

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

然后这个对象被分配给一个std::pair<int,int>这要归功于 templated assignment operator .此运算符基本上允许可分配类型( U1T1U2T2 )内部分配(在您的情况下) doubleint和一个 charint .

该语言没有“预测”将使用表达式的变量类型的功能,这将需要制作 pair<int,int>中间没有这一步。

如果您想避免该步骤,您必须在构造对时明确,这意味着您不应该使用类型推导 std::make_pair而是std::pair的构造函数,它要求您输入显式类型。但是,我怀疑这会因为优化而提高性能。

关于c++ - make_pair 如何隐式推断类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15061271/

相关文章:

c++ - #include<utility> 在 dev c++ 头文件中

c++ - 在 Cocos2D-X 中创建带有新成员的图层?

c++ - 在 Qt 中添加外部库时出现错误 "File format not recognized"

c++ - OpenCV 中的 channel 顺序

c++ - 将函数 'a' 传递给函数 'b' 并需要 'a' 的参数列表。

c++ - 带有自定义构造函数的自定义 STL 分配器

c++ - C++中成对的指针

C++:std::cout 的顺序

c++ - 添加#define new 时不是可识别的运算符或类型

c++ - 我可以在 C++ 中使用 ** vector < pair <int ,vector < int >>> vec** 之类的声明吗?