Подтвердить что ты не робот

Является ли это оператором-конструктором или оператором преобразования?

class B
{
    public:
        operator B() const{ }    // What is this and what is the purpose?

    private:
        int m_i;
};

Итак, вопрос в том, что оператор преобразования или оператор конструктора и что его использует? Где его использовать?

4b9b3361

Ответ 1

Это функция преобразования, которая никогда не будет называться неявно. Стандарт на самом деле идет об этом немного. 12.3.2/1:

Функция преобразования никогда не используется для преобразования (возможно, cv-квалифицированного) объекта к (возможно, cv-квалифицированному) одному типу объекта (или ссылке на него) к базовому классу (возможно, cv-qualit) этого тип (или ссылку на него) или (возможно, cv-qualified) void.

И в сноске,

Эти преобразования рассматриваются как стандартные преобразования для целей разрешения перегрузки (13.3.3.1, 13.3.3.1.4) и, следовательно, инициализация (8.5) и явные приведения (5.2.9). Преобразование в void не вызывает никакой функции преобразования (5.2.9). Даже несмотря на то, что он никогда не вызывал прямого преобразования, такие функции преобразования могут быть объявлены и потенциально могут быть достигнуты путем вызова функции виртуального преобразования в базовом классе.

Кроме того, функции преобразования по-прежнему являются нормальными функциями и могут быть вызваны явно по имени.

Примечание о виртуальных функциях применимо к коду, подобному этому:

class B;

struct A {
    virtual operator B() const = 0;
};

struct B : A
{
    public:
        operator B() const{ return B(); } // virtual override

    private:
        int m_i;
};

A const & q = B(); // q has dynamic type B, static type A
B r = q; // Convert A to B using B::operator B()

Педантичное примечание: "оператор преобразования" - это плохая терминология. Они известны как функции преобразования, и они не рассматриваются как случай перегрузки оператора, несмотря на ключевое слово operator.

Ответ 2

Это оператор преобразования. Это позволяет вам нанести объект типа B на объект типа B.