如果使用{},则函数调用不会模糊

问题描述

#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

解决方法

为什么{}隐式转换为int

这是copy-list-initialization,因为该参数的值初始化为0值初始化(零初始化)。 int可以从(空)braced-init-list初始化,就像int i{};int i = {};一样。

  1. 在函数调用表达式中,将braced-init-list用作参数,并使用list-initialization初始化函数参数

要调用f(std::vector<int>)f(std::deque<int>),需要用户定义的转换(由std::vectorstd::deque的构造函数采用std::initializer_list);那么第一个重载将获得重载解决方案。

,

编辑:我想删除此帖子,因为它是错误的(抱歉,我忘记了vector / deque的初始化程序列表构造函数不是模板)。不幸的是,只要它是公认的答案,我就无法做到。


std::vectorstd::deque的单个参数构造函数是显式的。对于空的初始化程序列表,无法进行自动类型推断,从而消除了所有与f(std::vector<int>)f(std::deque<int>)重载匹配的方式。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...