Есть ситуация, когда я хочу собрать все имена узлов пути к ключу в JSON. Рассмотрим условие индекса массива «0», «1» также допускается, но легко забыть кавычки, которые могут привести к сбою при разыменовании. Поэтому я хочу отказаться от этого. Пример:
#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;
}
Я нашел и попробовал это. Как избежать неявных преобразований в не конструирующих функциях? следующим образом:
#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;
}
Но компилятор до сих пор не понял меня.
Любое предложение?
Пожалуйста, укажите на любое неправильное использование терминологии и предположений, спасибо!
std::vector<const char*>
вместоstd::vector<std::string>>
?nullptr
также запретить ?Ответы:
Что-то вроде этого? Это очень похоже на решение по перегрузке, которое вы предложили, но требует переноса векторного типа. Не в состоянии строить, если вы предоставляете литерал,
0
потому что выбрана перегрузка удаленного конструктора.источник
Оглядываясь назад, многие из неявных преобразований в C ++ неудачны, и это один из них.
Один вариант для рассмотрения
-Wzero-as-null-pointer-constant
на gcc и clang. Будьте осторожны, так как это меняет поведение стандартных программ и, если оно включено глобально, может привести к непредвиденным последствиям.g ++ - как отключить неявное преобразование из 0 в типы указателей?
Какое предупреждение Clang эквивалентно константе Wzero-as-null-pointer из GCC?
источник
Мне нравится ответ Микеля Рыхлиски . Однако в Библиотеке поддержки уже существует решение :
gsl::not_null
Я очень рекомендую GSL. Он создан и поддерживается многими экспертами C ++, в том числе Бьярном Страуструпом и Хербом Саттером. А основные принципы C ++ активно интегрируются в предупреждения компилятора и статические анализаторы.
источник