Jest sytuacja, w której chcę zebrać wszystkie nazwy węzłów ścieżki do klucza w JSON. Zastanów się nad warunkiem, że indeks tablicy „0”, „1” są również dozwolone, ale łatwo jest zapomnieć o cudzysłowach, co doprowadziłoby do awarii, gdy dereferencja. Więc chcę to odrzucić. Przykład:
#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;
}
Znalazłem i wypróbowałem to Jak uniknąć niejawnej konwersji na funkcje niebędące konstruktorami? jak następuje:
#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;
}
Ale kompilator wciąż mnie nie rozumiał.
Jakieś sugestie?
Proszę wskazać wszelkie niewłaściwe użycie terminologii i założeń, dziękuję!
std::vector<const char*>
zamiaststd::vector<std::string>>
?nullptr
?Odpowiedzi:
Coś takiego? Jest bardzo podobny do proponowanego rozwiązania przeciążeniowego, ale wymaga zawinięcia typu wektora. Nie można zbudować, jeśli podasz literał,
0
ponieważ wybrano przeciążenie usuniętego konstruktora.źródło
Z perspektywy czasu wiele niejawnych konwersji w C ++ jest niefortunnych, jest to jedna z nich.
Jedną z opcji do rozważenia jest
-Wzero-as-null-pointer-constant
gcc i clang. Bądź ostrożny, ponieważ zmienia to zachowanie standardowych programów, a jeśli zostanie włączone globalnie, może mieć niezamierzone efekty.g ++ - jak wyłączyć niejawną konwersję z 0 na typy wskaźników?
Które ostrzeżenie Clanga jest równoważne stałej Wzero-as-null-pointer-stałej z GCC?
źródło
Podoba mi się odpowiedź Mikela Rychlińskiego . Jednak istnieje już rozwiązanie w bibliotece wsparcia wytycznych :
gsl::not_null
Bardzo polecam GSL. Jest tworzony i wspierany przez wielu ekspertów C ++, w tym samego Bjarne Stroustrup i Herb Suttera. A ++ Wytyczne C rdzeniowe są aktywnie zintegrowane ostrzeżeń kompilatora i analizatorów statycznych.
źródło