Рассмотрим этот код:
#include <vector>
#include <iostream>
enum class A
{
X, Y
};
struct Test
{
Test(const std::vector<double>&, const std::vector<int>& = {}, A = A::X)
{ std::cout << "vector overload" << std::endl; }
Test(const std::vector<double>&, int, A = A::X)
{ std::cout << "int overload" << std::endl; }
};
int main()
{
std::vector<double> v;
Test t1(v);
Test t2(v, {}, A::X);
}
https://godbolt.org/z/Gc_w8i
Это печатает:
vector overload
int overload
Почему это не приводит к компиляции ошибка из-за неоднозначного разрешения перегрузки? Если второй конструктор будет удален, мы получим vector overload
два раза. Как / чем метри c является int
однозначно лучшим соответствием для {}
, чем std::vector<int>
?
Подпись конструктора, безусловно, может быть обрезана дальше, но меня только обманул эквивалентный кусок кода и хочу убедиться, что ничего важного не потеряно для этого вопроса.