#include <string>
#include <type_traits>
#include <iostream>
struct A{
A(int ,double) {}
};
struct B{
B(int ,double) {}
};
template<class T=A>
void f(T a,
typename std::enable_if<std::is_same<T,A>::value>::type* = 0 ){
std::cout<<"In f(A a)\n";
}
void f(B b){std::cout<<"In f(B b)\n";}
int main(int argc, char**argv)
{
f({1,2}); //It's not ambiguity anymore and calls f(B a)
f(A{1,2});//call f(A a)
f(B{1,2});//call f(B b)
//f(2); error
}
CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IEF7CiAgICAgQShpbnQgLGRvdWJsZSkge30KfTsKCnN0cnVjdCBCewogICAgIEIoaW50ICxkb3VibGUpIHt9Cn07Cgp0ZW1wbGF0ZTxjbGFzcyBUPUE+CnZvaWQgZihUIGEsCiAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3NhbWU8VCxBPjo6dmFsdWU+Ojp0eXBlKiA9IDAgKXsKICAgIHN0ZDo6Y291dDw8IkluIGYoQSBhKVxuIjsKfQoKdm9pZCBmKEIgYil7c3RkOjpjb3V0PDwiSW4gZihCIGIpXG4iO30KCmludCBtYWluKGludCBhcmdjLCBjaGFyKiphcmd2KQp7CiAgICBmKHsxLDJ9KTsgLy9JdCdzIG5vdCBhbWJpZ3VpdHkgYW55bW9yZSBhbmQgY2FsbHMgZihCIGEpCiAgICBmKEF7MSwyfSk7Ly9jYWxsIGYoQSBhKQogICAgZihCezEsMn0pOy8vY2FsbCBmKEIgYikKICAgIC8vZigyKTsgZXJyb3IKfQo=