Nach this Lesen habe ich versucht, eine solche Umwandlung mit static_cast
machen:static_cast Konvertierungskonstruktor vs Conversion Operator
class A;
class B {
public:
B(){}
B(const A&) //conversion constructor
{
cout << "called B's conversion constructor" << endl;
}
};
class A {
public:
operator B() const //conversion operator
{
cout << "called A's conversion operator" << endl;
return B();
}
};
int main()
{
A a;
//Original code, This is ambiguous,
//because both operator and constructor have same cv qualification (use -pedantic flag)
B b = a;
//Why isn't this ambiguous, Why is conversion constructor called,
//if both constructor and operator have same c-v qualification
B c = static_cast<B>(a);
return 0;
}
ich erwartet, dass es nicht kompilieren, weil beide Bauer und -betreiber gleiche c-v Qualifikation. Aber es kompiliert, erfolgreich und static_cast
ruft Konstruktor anstelle von Operator. Warum?
(mit gcc 4.8.1 mit pedantic
und Wall
Flags kompiliert)
Ich verstehe, dass dieser Satz bedeutet, dass, wenn 'B temporäre (a)' ist gültig 'static_cast' kann vorgeformt werden, aber ich sehe dort nicht, warum Konstruktor Vorrang hat. – PcAF
@PcAF, Ich konnte keine Klausel finden, die besagt, dass 'static_cast' mit dem Konvertierungsoperator ausgeführt werden kann. Wenn es jedoch einen gibt, wird ihm eine niedrigere Priorität gegeben als oben. –
@R Sahu Entferne 'B (const A &)' Konvertierungskonstruktor und jetzt 'static_cast' arbeitet mit Konvertierungsoperator. – PcAF