如果使用 {},函数调用不会有歧义

Function call not ambiguous if {} is used

#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;
}

如果第一个函数被注释掉,我在编译时得到 ambiguous call。如果未注释掉,则调用第一个函数。为什么 {} 隐式转换为 int

实例:https://onlinegdb.com/rkhR0NiBD

Why is {} implicitly converted to int?

这是copy-list-initialization,因为效果参数是value-initialized(zero-initialized) as 0int 可以从(空)braced-init-list 初始化,就像 int i{};int i = {};.

  1. in a function call expression, with braced-init-list used as an argument and list-initialization initializes the function parameter

为了调用f(std::vector<int>)f(std::deque<int>),一个user-defined转换(由std::vectorstd::deque的构造函数采用std::initializer_list ) 是必须的;然后第一个重载在重载决议中获胜。

编辑:我想删除这个 post 因为它是错误的(抱歉,我忘记了 vector/deque 的初始化列表构造函数不是模板)。不幸的是,只要它是公认的答案,我就不能这样做。


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

所以构造一个int是唯一的匹配。