Há uma situação em que desejo coletar todos os nomes de nós de um caminho para uma chave no JSON. Considere a condição do índice de matriz "0", "1" também é permitida, mas é fácil esquecer as aspas, o que levaria a uma falha quando a desreferencia. Então, eu quero rejeitar isso. Exemplo:
#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;
}
Encontrei e tentei isso Como evito conversões implícitas em funções não construtivas? como segue:
#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;
}
Mas o compilador ainda não me entendeu.
Alguma sugestão?
Aponte qualquer uso indevido de terminologias e suposições, obrigado!
std::vector<const char*>
vez destd::vector<std::string>>
?nullptr
também?Respostas:
Algo assim? É muito semelhante à solução de sobrecarga que você sugeriu, mas requer agrupar o tipo de vetor. Falha ao construir se você fornecer um literal
0
porque a sobrecarga de construtor excluída foi escolhida.fonte
Em retrospectiva, muitas das conversões implícitas em C ++ são lamentáveis, sendo essa uma delas.
Uma opção a considerar é
-Wzero-as-null-pointer-constant
no gcc e no clang. Tenha cuidado, pois isso altera o comportamento dos programas padrão e, se ativado globalmente, pode ter alguns efeitos indesejados.como desabilitar a conversão implícita de 0 para tipos de ponteiro?
Qual aviso de Clang é equivalente à constante Wzero-como-nulo-ponteiro do GCC?
fonte
Eu gosto da resposta de Mikel Rychliski . No entanto, já existe uma solução na Guideline Support Library :
gsl::not_null
Eu recomendo a GSL. Foi criado e apoiado por muitos especialistas em C ++, incluindo o próprio Bjarne Stroustrup e Herb Sutter. E as Diretrizes Principais do C ++ estão sendo ativamente integradas aos avisos do compilador e aos analisadores estáticos.
fonte