Перво-наперво:
$ 12.3.1 / 1 - "Конструктор, объявленный без явного спецификатора функции, определяет преобразование типов его параметров в тип своего класса.конструктор называется конвертирующим конструктором. "
В вашем примере INT - это определяемый пользователем класс, который имеет конвертирующий конструктор из 'int'.
Поэтому следующий код хорошоFormed:
INT i(1024); // direct initialization syntax
Это означает, что вы можете получить объект INT из целого числа.Однако что делать, если объект INT нужно преобразовать обратно в целое число?Транзитивность?
Можно сказать, что класс INT может предоставить функцию-член для возврата инкапсулированного целочисленного члена
int x = i.geta();
Это, однако, не очень интуитивно понятно и не является стандартизированным подходом.Кроме того, это не интуитивно понятно, когда речь идет о том, как встроенные типы работают в таких ситуациях.
int z = 0;
int y1 = z; // copy initialization or
int y2(z); // direct initialization
double d = (int )z; // explicit cast
Поэтому Стандарт допускает такую стандартизацию и интуитивность преобразования пользовательских типов, говоря:
$ 12.3 / 2 - "Функция-член класса X, не имеющая параметров с именем вида [...]
operator-type-id
[...] определяет преобразование из X в тип, указанный в ID-типе преобразования. Такие функции называются функциями преобразования. Тип возврата не может быть указан. Если функция преобразования является функцией-членом,тип функции преобразования (8.3.5) - «функция, не принимающая параметров, возвращающих ID-типа преобразования».
Это делает все следующее правильно сформированным, а сохраняет гармонию сспособ работы встроенных типов равен
int y1 = i; // copy initialization or
int y2(i); // direct initialization
double d = (int )i; // explicit cast