Il y a une situation où je veux collecter tous les noms de nœuds d'un chemin d'accès à une clé dans JSON. Tenez compte de la condition de l'index du tableau "0", "1" sont également autorisés, mais il est facile d'oublier les guillemets, ce qui conduirait à un crash lors de la déréférence. Je veux donc rejeter cela. Exemple:
#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;
}
J'ai trouvé et essayé ceci Comment éviter les conversions implicites sur des fonctions non constructives? comme suit:
#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;
}
Mais le compilateur ne m'a toujours pas compris.
Toute suggestion?
Veuillez signaler toute utilisation abusive des terminologies et des hypothèses, merci!
std::vector<const char*>
place destd::vector<std::string>>
?nullptr
aussi interdire ?Réponses:
Quelque chose comme ça? Elle est très similaire à la solution de surcharge que vous avez suggérée, mais nécessite un habillage du type de vecteur. Échec de la construction si vous fournissez un littéral
0
car la surcharge de constructeur supprimée est choisie.la source
Avec le recul, la plupart des conversions implicites en C ++ sont regrettables, ceci étant l'un d'entre eux.
Une option à considérer est
-Wzero-as-null-pointer-constant
sur gcc et clang. Soyez prudent car cela modifie le comportement des programmes standard et, s'il est activé globalement, peut avoir des effets inattendus.g ++ - comment désactiver la conversion implicite de 0 en types de pointeurs?
Quel avertissement Clang est équivalent à Wzero-as-null-pointer-constant de GCC?
la source
J'aime la réponse de Mikel Rychliski . Cependant, il existe déjà une solution dans Guideline Support Library :
gsl::not_null
Je recommande fortement GSL. Il est créé et soutenu par de nombreux experts C ++, Bjarne Stroustrup lui-même et Herb Sutter parmi eux. Et les directives de base C ++ sont activement intégrées dans les avertissements du compilateur et les analyseurs statiques.
la source