Essa questão pode ser considerada provavelmente teórica, pois não vejo por que eu teria esse design em código real. Tenho duas classes com alguns operadores de conversão:
class B;
class A {
public:
A() = default;
A(B const &);
};
class B {
public:
B() = default;
operator A();
};
A::A(B const &) {};
B::operator A() { return A{}; };
int main() {
[[maybe_unused]] A ad{B{}}; // direct init
[[maybe_unused]] A ac = B{}; // copy init
}
Com gcc somente e com inicialização de cópia somente, recebo este aviso:
aviso: escolhendo 'B::operator A()' em vez de 'A::A(const B&)' [-Wconversion]
aviso: para conversão de 'B' para 'A' [-Wconversion]
nota: porque a sequência de conversão para o argumento é melhor
Não sendo bem versado nas regras de conversão, não entendo se esse aviso é relevante? Se não, como pode ser silenciado (pode ser doloroso com -Werror
)?
NB Adicionando um pouco de traces , observei comportamentos diferentes de acordo com os compiladores e a natureza da inicialização. As sequências de conversão são dependentes da implementação até certo ponto?