Es ist etwas falsch mit, wie der Konvertierungsoperator im folgenden Code verhält:10 Konvertierungsoperator umgeht den Konstruktor des abgeleiteten Typs und überspringt die Initialisierung des Basistyps?
test.cpp:24:7: error: use of deleted function 'A::A(const A&)'
foo(c); //2) Not Ok
^
Die Frage ist also: warum in der Hölle
struct A{
A(){};
A(const A &) = delete;
};
struct B : A{
B(const B & x){};
B(int x){};
};
struct C{
operator B() {
return B(1);
};
};
void foo(const A & x){
};
int main(){
C c;
foo(c.operator B()); //1) Ok
foo(c); //2) Not Ok
return 0;
};
ich einen Fehler im Aufruf 2) erhalten es möchte A kopieren-initialisieren? Beachten Sie, dass B einen eigenen Kopierkonstruktor deklariert. Ich würde zwar das 1) was erfolgreich ist identisch mit 2), aber anscheinend ist es nicht?
Auf das praktische Problem versuche ich zu lösen: In der Klasse C wollte ich eine Konvertierung in eine Drittanbieter-Klasse A, die das Kopieren verbietet, bereitstellen. Die Idee war, einen Proxy B: A zurückzugeben, der die Bewegungssemantik über A hinzufügt. Gibt es vielleicht eine andere Möglichkeit, den Konvertierungsoperator so zu definieren, dass er A auf dem Stapel erhält, während er seine Nicht-Kopier-Richtlinie befolgt.
Oh Mist, ich habe jetzt herausgefunden, es Fehler in gcc 4.8.3 und VS Nov_2013, aber funktioniert ok mit gcc 4.9.3 und clang-7.0.2. Da es sich offenbar um einen gelösten Compiler-Bug handelt, sollte ich die Frage ablehnen? –
Nein, das ist eine gültige Frage. Es ist nichts falsch mit einer Frage, die sich als Compiler-Fehler herausstellt. –