2016-10-28 2 views
0

Что такое использование неявного преобразования в C++, когда я вызываю функцию, которая принимает параметры как int, а я передаю аргумент, который является двойным? Почему это не ошибка времени компиляции? Что происходит в стеке выполнения, что позволяет это произойти?Неявное преобразование и вызов функции

#include <iostream> 
void foo(int num); 

int main() { 
    double doub= 4.9; 
    foo(doub); 
    return 0; 
} 

void foo(int num){ 
    std::cout<<num<<std::endl; 
} 
+3

* Почему это не ошибка времени компиляции? * В 80-х годах языки программирования не были такими безопасными по типу, как сейчас. C++ обратно совместим с C. – DeiDei

+0

Стек исполняемого файла, ничего. Вы не хотите этого во время выполнения. Вы замедляете все, чтобы поймать несколько неправильных строк кода. Поднимите уровень предупреждения вашего компилятора, и вы должны получить предупреждение о преобразовании. – user4581301

+0

@ user4581301 разве это не беспорядок с компилятором, так как int и double имеют одинаковый размер? Делает неявное преобразование, подобное этому, иногда даже полезно? –

ответ

2

Вот длинный список всех implicit conversions, что делает C++. Этот конкретный один покрывается:

плавающей интегральные конверсий A prvalue типа с плавающей точкой может быть преобразовано в prvalue любого целого типа. Дробная часть усечена, т. Е. Дробная часть отбрасывается. Если значение не может вписаться в тип адресата, поведение не определено (даже , если тип назначения не указан, по модулю арифметики не применяется ). Если тип назначения - bool, это логическое преобразование (см. Ниже).

+0

Спасибо за ссылку, но я хотел бы знать. Каково использование разрешения неявного преобразования? По-моему, это просто осложняет работу компилятора. Почему бы просто не удалить его сейчас? –

+1

@ HamzaKhan40-несколько лет кода сломался. Подобные изменения обрабатываются очень осторожно. Если вы хотите, чтобы это была ошибка, включите предупреждения, соответствующие вашему компилятору, и установите предупреждения как флаг ошибок. – user4581301

+0

@HamzaKhan С практической точки зрения люди ожидают, что цифры будут числами. Они ожидают преобразование числа с плавающей запятой в целое число, чтобы захватить целочисленный компонент числа, и они ожидают преобразования целого числа в число с плавающей запятой, чтобы создать ближайшее представление этого целочисленного числа с плавающей запятой. –

 Смежные вопросы

  • Нет связанных вопросов^_^