Warum ist eine Klasse mit Kopierkonstruktor und gelöschtem Verschiebungskonstruktor nicht in sich selbst konvertierbar?C++

Programme in C++. Entwicklerforum
Guest
 Warum ist eine Klasse mit Kopierkonstruktor und gelöschtem Verschiebungskonstruktor nicht in sich selbst konvertierbar?

Post by Guest »

Die Abfragen „is_convertible_v Move-Konstruktor gelöscht“ und „c++ gelöschter Move-Konstruktor machen die Klasse nicht in sich selbst konvertierbar“, daher hoffe ich, dass ich nicht etwas dupliziere, das bereits beantwortet wurde ... hier geht es ...
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);
Es scheint nicht in sich selbst konvertierbar zu sein. Warum ist das so?
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(); }
Und siehe da, das funktioniert nicht mit der Fehlermeldung „Fehler: Verwendung der gelöschten Funktion „OnlyCopyable::OnlyCopyable(OnlyCopyable&&)“.
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?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post