Es gibt eine Situation, in der ich alle Knotennamen eines Pfads zu einem Schlüssel in JSON sammeln möchte. Bedenken Sie, dass die Bedingung des Array-Index "0", "1" ebenfalls zulässig ist, aber es ist leicht, die Anführungszeichen zu vergessen, was zu einem Absturz führen würde, wenn eine Dereferenzierung durchgeführt wird. Also möchte ich das ablehnen. Beispiel:
#include <vector>
#include <iostream>
int func(const std::vector<const char*>& pin) {
return pin.size();
}
int main() {
// {"aname", "3", "path", "0"} wanted but this still compile
std::cout << func({"aname", "3", "path", 0}) << std::endl;
}
Ich habe dies gefunden und ausprobiert. Wie vermeide ich implizite Konvertierungen für nicht konstruierende Funktionen? wie folgt:
#include <vector>
#include <iostream>
int func(const std::vector<const char*>& pin) {
return pin.size();
}
template<typename T>
int func(T pin) = delete;
int main() {
std::cout << func({"aname", "3", "path", 0}) << std::endl;
}
Aber der Compiler hat mich immer noch nicht verstanden.
Irgendein Vorschlag?
Bitte weisen Sie auf einen Missbrauch von Terminologien und Annahmen hin, danke!
std::vector<const char*>
anstelle von verwendenstd::vector<std::string>>
?nullptr
?Antworten:
Etwas wie das? Es ist der von Ihnen vorgeschlagenen Überladungslösung sehr ähnlich, erfordert jedoch das Umschließen des Vektortyps. Kann nicht erstellt werden, wenn Sie ein Literal angeben,
0
da die gelöschte Konstruktorüberladung ausgewählt ist.quelle
Im Nachhinein sind viele der impliziten Konvertierungen in C ++ unglücklich, dies ist eine davon.
Eine Option, die in Betracht gezogen werden sollte, ist
-Wzero-as-null-pointer-constant
gcc und clang. Seien Sie vorsichtig, da dies das Verhalten von Standardprogrammen ändert und bei globaler Aktivierung einige unbeabsichtigte Auswirkungen haben kann.g ++ - Wie deaktiviere ich die implizite Konvertierung von 0 in Zeigertypen?
Welche Clang-Warnung entspricht der Null-Zeiger-Konstante Wzero von GCC?
quelle
Ich mag Mikel Rychliskis Antwort . In der Guideline Support Library gibt es jedoch bereits eine Lösung :
gsl::not_null
Ich kann GSL nur empfehlen. Es wurde von vielen C ++ - Experten erstellt und unterstützt, darunter auch Bjarne Stroustrup und Herb Sutter. Die C ++ - Kernrichtlinien werden aktiv in die Compiler-Warnungen und statischen Analysatoren integriert.
quelle