#include <iostream>
#include <vector>
#include <stdexcept>
template <typename T>
void f(const T &) { std::cout << "NO" << std::endl; }
template <typename T, int SFINAE = sizeof(static_cast<std::ostream &(std::ostream::*)(T)>(
&std::ostream::operator<<))>
void f(const T &) { std::cout << "YES" << std::endl; }
int main() {
typedef const char *(std::exception::*F0)() const;
F0 f0 = &std::exception::what;
f(0);
f("abc");
f(static_cast<const char *>("abc"));
f(0.);
f(f0);
f(std::vector<int>());
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RkZXhjZXB0PgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgZihjb25zdCBUICYpIHsgc3RkOjpjb3V0IDw8ICJOTyIgPDwgc3RkOjplbmRsOyB9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IFNGSU5BRSA9IHNpemVvZihzdGF0aWNfY2FzdDxzdGQ6Om9zdHJlYW0gJihzdGQ6Om9zdHJlYW06OiopKFQpPigKCSZzdGQ6Om9zdHJlYW06Om9wZXJhdG9yPDwpKT4Kdm9pZCBmKGNvbnN0IFQgJikgeyBzdGQ6OmNvdXQgPDwgIllFUyIgPDwgc3RkOjplbmRsOyB9CgppbnQgbWFpbigpIHsKCXR5cGVkZWYgY29uc3QgY2hhciAqKHN0ZDo6ZXhjZXB0aW9uOjoqRjApKCkgY29uc3Q7CiAJRjAgZjAgPSAmc3RkOjpleGNlcHRpb246OndoYXQ7CgoJZigwKTsKCWYoImFiYyIpOwoJZihzdGF0aWNfY2FzdDxjb25zdCBjaGFyICo+KCJhYmMiKSk7CglmKDAuKTsKCWYoZjApOwoJZihzdGQ6OnZlY3RvcjxpbnQ+KCkpOwoKCXJldHVybiAwOwp9
prog.cpp: In function 'int main()':
prog.cpp:16:5: error: call of overloaded 'f(int)' is ambiguous
f(0);
^
prog.cpp:6:6: note: candidate: void f(const T&) [with T = int]
void f(const T &) { std::cout << "NO" << std::endl; }
^
prog.cpp:10:6: note: candidate: void f(const T&) [with T = int; int SFINAE = 8]
void f(const T &) { std::cout << "YES" << std::endl; }
^
prog.cpp:19:6: error: call of overloaded 'f(double)' is ambiguous
f(0.);
^
prog.cpp:6:6: note: candidate: void f(const T&) [with T = double]
void f(const T &) { std::cout << "NO" << std::endl; }
^
prog.cpp:10:6: note: candidate: void f(const T&) [with T = double; int SFINAE = 8]
void f(const T &) { std::cout << "YES" << std::endl; }
^