Ich habe die folgende Klasse:
Code: Select all
#include
struct OnlyCopyable {
OnlyCopyable() { }
~OnlyCopyable() { }
OnlyCopyable(const OnlyCopyable &src) { }
OnlyCopyable& operator=(const OnlyCopyable &other) { return *this; }
OnlyCopyable(OnlyCopyable &&other) = delete;
OnlyCopyable& operator=(OnlyCopyable &&other) = delete;
};
static_assert(std::is_convertible_v);
Wenn ich die Zeilen auskommentiere und dabei explizit die Verschiebungsoperatoren lösche, wird es konvertierbar. Warum ist das so?
CPPReference sagt Folgendes:
Wenn die imaginäre Funktionsdefinition To test() { return std::declval(); ist wohlgeformt (d. h. entweder std::declval() kann mithilfe impliziter Konvertierungen in To konvertiert werden, oder sowohl From als auch To sind möglicherweise cv-qualifiziert void), liefert den Mitgliedskonstantenwert gleich true
Was ich gelesen habe Dies bedeutet, dass eine Klasse nur mit einem Kopierkonstruktor konvertierbar sein sollte selbst... was habe ich verpasst? Danke.
BEARBEITEN:
Ich habe etwas weiter recherchiert und gemäß dem obigen Zitat Folgendes definiert:
Code: Select all
OnlyCopyable test() { return std::declval(); }
Ich kann verstehen, warum das oben Gesagte fehlgeschlagen ist, weil ein gelöschter Operator immer noch Teil der Überlastungsauflösung ist und, wenn er ausgewählt wird, einen Fehler verursacht.
Das ist mir allerdings immer noch ein Rätsel ... warum Ist die Konvertierbarkeit auf diese Weise definiert? Sicherlich ist die Klasse immer noch konvertierbar ... nur durch Kopieren und nicht durch Verschieben?