Так работает C ++.Компилятор попытается неявно преобразовать тип, который вы даете ему, в нужный ему тип, даже если это сужающее преобразование (исключение было сделано при инициализации фигурной скобки. Там вы получаете ошибку).В этом случае он преобразует int
, который вы ему дадите, в char
с тем же значением и продолжением.
Поскольку все указанные вами значения являются постоянными времени компиляции в диапазоне [0, 127], это никогда не может завершиться ошибкой, поэтому вы даже не получите предупреждение о том, что вы можете переполниться.
Если бы вы использовали что-то вроде
Display(2000, 32, 47);
Вы бы получили предупреждение от GCC и Clang, например
GCC
main.cpp:12:12: warning: overflow in conversion from 'int' to 'char' changes value from '2000' to ''\37777777720'' [-Woverflow]
Display(2000, 32, 47);
Clang
main.cpp:12:12: warning: implicit conversion from 'int' to 'char' changes value from 2000 to -48 [-Wconstant-conversion]
Display(2000, 32, 47);
Уведомление о том, что вы делаете что-то плохое, но это может сделать толькотак что, если он знает, каковы значения.Если у вас есть
int main()
{
int a, b, c;
std::cin >> a >> b >> c;
Display(a, b, c);
Display('a', 'b', 'c');
return 0;
}
Тогда он не знает, что это за значения, поэтому не выдаст предупреждение.
Если вы действительно хотите остановить это, вы можете добавить перегрузку, котораязанимает int
с и удаляет его, так что это вызовет ошибку компилятора, такую как
void Display(char a, char b, char c)
{
cout << a << " " << b << " " << c << endl;
}
void Display(int, int, int) = delete;
int main()
{
int a, b, c;
std::cin >> a >> b >> c;
Display(a, b, c);
return 0;
}
Ошибка:
prog.cc: In function 'int main()':
prog.cc:31:20: error: use of deleted function 'void Display(int, int, int)'
Display(a, b, c);
^
prog.cc:25:6: note: declared here
void Display(int, int, int) = delete;
Вы также можете сделать все возможное и использовать
template<typename T, typename U, typename V>
void Display(T, U, V) = delete;
и это вызовет Display
ошибку с чем-либо, кроме 3 char
с.