Ответ 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
.