使用 {} 时,函数调用不会产生歧义。

6
#include <stdio.h>
#include <vector>
#include <deque>

// 1st function
void f(int i, int j = 10){
    printf("Hello World what");
};

void f(std::vector<int>){
    printf("Hello World vec");
};

void f(std::deque<int>){
    printf("Hello World deq");
};

int main()
{
    f({});
    return 0;
}

如果注释掉第一个函数,在编译时会出现“模糊调用”的错误。如果不注释掉,就会调用第一个函数。为什么“{}”会隐式转换为“int”?
实时示例:https://onlinegdb.com/rkhR0NiBD
2个回答

5
为什么 {} 会被隐式转换为 int
这是复制列表初始化,其效果是将参数作为值进行初始化(零初始化)为 0。就像 int i{}; 或者 int i = {};一样,int可以从(空)花括号初始化列表中进行初始化。
在函数调用表达式中,使用花括号初始化列表作为参数并进行列表初始化以初始化函数参数:
对于 f(std::vector<int>)f(std::deque<int>) 的调用,需要进行用户自定义转换(由 std::vectorstd::deque 的构造函数接受 std::initializer_list 实现);然后第一个重载在重载解析中胜出。

0

编辑:我想删除这篇帖子,因为它是错误的(很抱歉,我忘记了vector/deque的初始化器列表构造函数不是模板)。不幸的是,只要它是被接受的答案,我就无法删除它。


std::vectorstd::deque的单参数构造函数是显式的。对于空初始化列表,自动类型推导是不可能的,这消除了匹配f(std::vector<int>)f(std::deque<int>)重载的所有方法。

因此,构造一个int是唯一的匹配。


4
这是不正确的。initializer_list 构造函数不是显式的。实际上,它们都匹配,因此存在歧义。 - cigien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接