Hay una situación en la que quiero recopilar todos los nombres de nodos de una ruta a una clave en JSON. Tenga en cuenta la condición del índice de matriz "0", "1" también están permitidos, pero es fácil olvidar las comillas, lo que provocaría un bloqueo cuando se desreferenciara. Entonces quiero rechazar esto. Ejemplo:
#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;
}
Encontré y probé esto ¿Cómo evito las conversiones implícitas en funciones que no son de construcción? de la siguiente manera:
#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;
}
Pero el compilador todavía no me entendió.
¿Cualquier sugerencia?
Señale cualquier mal uso de terminologías y suposiciones, ¡gracias!
std::vector<const char*>
lugar destd::vector<std::string>>
?nullptr
también?Respuestas:
¿Algo como esto? Es muy similar a la solución de sobrecarga que sugirió, pero requiere ajustar el tipo de vector. No se genera si proporciona un literal
0
porque se elige la sobrecarga del constructor eliminado.fuente
En retrospectiva, muchas de las conversiones implícitas en C ++ son desafortunadas, siendo esta una de ellas.
Una opción a considerar es
-Wzero-as-null-pointer-constant
en gcc y clang. Tenga cuidado ya que esto cambia el comportamiento de los programas estándar y, si está habilitado a nivel mundial, puede tener algunos efectos no deseados.g ++: ¿cómo desactivo la conversión implícita de 0 a tipos de puntero?
¿Qué advertencia de Clang es equivalente a Wzero-as-null-pointer-constant de GCC?
fuente
Me gusta la respuesta de Mikel Rychliski . Sin embargo, ya existe una solución en Guideline Support Library :
gsl::not_null
Recomiendo mucho GSL. Fue creado y respaldado por muchos expertos en C ++, entre ellos el propio Bjarne Stroustrup y Herb Sutter. Y las Pautas principales de C ++ se están integrando activamente en las advertencias del compilador y los analizadores estáticos.
fuente