Рассмотрим эту программу:
#include <iostream>
#include <type_traits>
using namespace std;
struct russell {
template <typename barber,
typename = typename enable_if<!is_convertible<barber, russell>::value>::type>
russell(barber) {}
};
russell verify1() { return 42L; }
russell verify2() { return 42; }
int main ()
{
verify1();
verify2();
cout << is_convertible<long, russell>::value;
cout << is_convertible<int, russell>::value;
return 0;
}
Если какой-либо тип barber
не конвертируется в russell
. мы пытаемся создать парадокс, сделав его конвертируемым (включив конструктор преобразования).
Вывод 00
с тремя популярными компиляторами, хотя конструкторы, очевидно, работают.
Я подозреваю, что поведение должно быть undefined, но не может найти ничего в стандарте.
Каким должен быть выход этой программы и почему?