Ответ 1
struct C
{
operator C()
{
}
};
также допускается и дает такое же предупреждение. Он упоминается в п. 12.3.2/1:
Функция преобразования никогда не используется для преобразования (возможно cv-квалифицированный) объект для (возможно, cv-квалифицированного) того же типа объекта (или ссылкой на него), к базовому классу (возможно, cv-qualit) этот тип (или ссылка на него) или (возможно, cv-qualified) void.
Другими словами, это не запрещено, но это просто ничего не делает. Yakk и Wintermute уже показали примеры синтаксиса вызова функции-члена, но cppreference показывает пример виртуальной отправки, как указано в сноске 116 (N3337, сноска 118 в N4140 ):
struct D;
struct B {
virtual operator D() = 0;
};
struct D : B
{
operator D() override { return D(); }
};
int main()
{
D obj;
D obj2 = obj; // does not call D::operator D()
B& br = obj;
D obj3 = br; // calls D::operator D() through virtual dispatch
}