Это особенно неясная особенность?
Да, операторы преобразования используются не очень часто. Места, которые я видел, предназначены для пользовательских типов, которые могут переходить во встроенные. Такие вещи, как класс чисел с фиксированной точностью, который поддерживает преобразование в / из типов атомарных чисел.
Это относительно портативно?
Насколько я знаю, это так. Они были в стандарте навсегда.
Можно ли выполнить пользовательские преобразования в пользовательские типы?
Да, это одна из особенностей конструкторов. Конструктор, который принимает один аргумент, эффективно создает оператор преобразования из типа аргумента в тип вашего класса. Например, такой класс:
class Foo {
public:
Foo(int n) {
// do stuff...
}
}
Давайте сделаем:
Foo f = 123;
Если вы использовали std::string
ранее, скорее всего, вы использовали эту функцию, не осознавая этого. (Кроме того, если вы хотите предотвратить такое поведение, объявите все конструкторы с одним аргументом, используя explicit
.)