R.12.3.2 Функции преобразования
R.12.3.2 Функции преобразования
Функция-член класса X, имя которой имеет вид,
имя-функции-преобразования:
operator имя-типа-преобразования
имя-типа-преобразования:
список-спецификаций-типа opt операция-ptr opt
задает преобразование из типа X в тип, определяемый конструкцией имя-типа-преобразования. Такие функции-члены называются функциями преобразования. В конструкции список-спецификаций-типа нельзя описывать классы, перечисления и имена-typedef, а также нельзя задавать типы формальных параметров и тип возвращаемого значения.
Приведем пример:
class X {
//…
public:
operator int();
};
void f(X a)
{
int i = int(a);
i = (int)a;
i = a;
}
Здесь во всех трех операторах присваиваемое значение будет преобразовываться с помощью функции X::operator int(). Пользовательские преобразования не ограничиваются только использованием в присваивании и инициализации, например:
void g(X a, X b)
{
int i = (a) ? 1+a : 0;
int j = (a&&b) ? a+b : i;
if (a) {//…
}
}
Операции преобразования наследуются. Функции преобразования могут быть виртуальными.
К данному значению неявно применяется не более одного пользовательского преобразования (с помощью конструктора или функции преобразования), например:
class X {
//…
public:
operator int();
};
class Y {
//…
public:
operator X();
};
Y a;
int b = a; // недопустимо: преобразование
// a.operator X().operator int() не применяется
int c = X(a); // нормально: a.operator X().operator int()
Пользовательские преобразования осуществляются неявно только при условии их однозначности. Функция преобразования производного класса не закрывает функцию преобразования базового класса, если только они не преобразуют к одному и тому же типу, например:
class X {
public:
//…
operator int();
};
class Y: public X {
public:
//…
operator void*();
};
void f(Y& a)
{
if (a) {// ошибка: неоднозначность
}
}