Ich versuche, die hässliche std::string::operator=(char)
Überladung irgendwie zu deaktivieren/zu markieren (die meiner Erfahrung nach nur verwendet wird, wenn man eine ganze Zahl fälschlicherweise einer Zeichenkette zuordnet und subtile und schwierige Fehler verursacht).Wie markiert man eine * Standard-Bibliothek * -Funktion/-Methode in meinem Projekt als veraltet (oder überhaupt nicht mehr)?
Ich habe versucht, mit:
eine explizite Spezialisierung mit einer statischen assert darin
#include <string> #include <type_traits> template<> std::basic_string<char> &std::basic_string<char>::operator=(char c) { static_assert(false, "Don't use this!"); }
, die nicht als
<string>
bereits tut eine explizite Instanziierungstd::string
- das
[[deprecated]]
Attribut, auf eine ähnliche Erklärung wie oben in verschiedenen Positionen angewendet; keine Position, die ich versuchte, schien ein vernünftiges Ergebnis zu liefern; =delete
, die aus ähnlichen Gründen versagt;- Ich dachte über die Verwendung von Linker Tricks (in ähnlicher Weise, in dem gleichen Projekt haben wir Laufzeitüberprüfungen auf
setlocale
Nutzungen mit der--wrap
ld
Linker-Option), aber die Tatsache, dass dies eine Vorlage und Inline-Methode ist kompliziert die Angelegenheit.
Nun zu den Fragen:
- gibt es eine Standardmethode, um irgendwie zu deaktivieren jede Funktion oder Methode in der Standardbibliothek (lesen (wie bei
=delete
passieren würde): in einer Bibliothek, wo man nicht ändern die Deklarationen in den Kopfzeilen)? - wie oben, aber, statt deaktivieren, eine Warnung hinzufügen (wie mit
[[deprecated]]
passieren würde); - versagt die Standardmethode, gibt es etwas g ++ - spezifisch?
- Wenn es keine "allgemeine" (= für jede Methode, jede Klasse, jede Funktion, ...) Lösung gibt, gibt es etwas, das wir auf diesen speziellen Fall anwenden könnten (= eine Methode einer Template-Klasse möglicherweise deaktivieren auch nur eine bestimmte Instantiierung)?
Sie haben eine lustige Definition von "veraltet", wenn Sie versuchen, eine statische Assert oder eine gelöschte Funktion zu verwenden. –
@ JonathanWakely: "insgesamt veraltet oder deaktiviert"; aber soweit es mich betrifft, ist es im Wesentlichen das Gleiche, ich würde wahrscheinlich "-Werror" auf eine solche Warnung verwenden, es gibt keinen triftigen Grund, diesen Zuweisungsoperator zu verwenden (genau wie es keinen Grund gibt, sagen zu können, "bekommt" 'oder die String-Literal =>' char * 'Konvertierung neben Legacy-Code-Kompatibilität). –