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) {// ошибка: неоднозначность

 }

}