std::make_pair自动类型推导疑问:为何返回不匹配的函数可编译?
关于
std::make_pair自动类型推导与返回值转换的疑问解答 这是个很有意思的细节问题,咱们一步步拆解来理解:
首先,你说得没错,std::make_pair(0, 0)确实会推导并返回std::pair<int, int>类型的对象——因为两个输入参数都是int,模板参数会被推导为int和int。
那为什么它能和函数返回的std::pair<int, double>兼容呢?关键在于C++的隐式转换规则以及std::pair的构造能力:
- 当你在返回语句中返回一个类型和函数返回值类型不匹配的对象时,C++会尝试用这个对象去构造一个符合返回值类型的临时对象。
std::pair提供了一个模板构造函数(C++11及之前都有类似的实现),大概形式是这样的:
只要template <typename U1, typename U2> pair(const pair<U1, U2>& other);U1可以隐式转换为当前pair的第一个类型,U2可以隐式转换为当前pair的第二个类型,这个构造就合法。
回到你的例子:
pair<int, int>的第一个元素int可以直接匹配pair<int, double>的第一个元素类型int;- 第二个元素
int可以通过隐式转换变成double(这是C++允许的基础类型转换)。
所以转换发生的具体环节是:在执行返回语句时,用make_pair生成的pair<int, int>对象,构造出一个pair<int, double>的临时对象,这个临时对象最终作为函数的返回值返回。
你可以做个小测试验证这个逻辑:如果把函数返回类型改成std::pair<int, std::string>,再返回std::make_pair(0, 0)就会编译失败——因为int没办法隐式转换为std::string,这个构造过程就不合法了。
内容的提问来源于stack exchange,提问作者Marius
相关产品推荐
相关产品推荐

