Почему нельзя использовать `std :: min` между `int` и `long long int`

#c #types #max #min

#c #типы #макс #min

Вопрос:

Итак, я просто хочу знать, почему я не могу передавать значения с разными типами данных в функции min и max?

 int a=7;
long long int b=5;
long long int c=min(a,b);
cout<<c;
  

У меня возникают сомнения, потому что я точно знаю, что компилятор может неявно вводить приведение из меньшего типа данных (int) в больший тип данных (long long int), так почему бы компилятору не ввести приведение здесь!

Комментарии:

1. Пожалуйста, всегда используйте тег для соответствующего языка программирования. Я полагаю, это C ?

2. да. Мои извинения.

3. вот почему они являются шаблонами. Вычет не работает, потому что два выведенных варианта неоднозначны. используйте явное приведение.

4. Я знаю, что оба варианта разные, но разве компилятор не обязан выполнять неявное приведение типов, если это возможно?

5. Понял. Это шаблонный класс. template <class T> const Tamp; min (const T amp; a, const T amp; b); Поэтому, если T равно int, то оба параметра являются int .

Ответ №1:

Это сводится к тому, как std::min и std::max были разработаны.

Они могли бы иметь два разных типа для двух параметров и использовать что-то вроде std::common_type , чтобы определить хороший тип результата. Но вместо этого они имеют один и тот же тип для обоих параметров, поэтому два передаваемых вами аргумента также должны иметь один и тот же тип.

компилятор может неявно вводить приведение от меньшего типа данных (int) к большему типу данных (long long int)

Да, но он также может неявно преобразовываться обратно из long long в int . («Приведение» — неправильное слово, оно означает явное преобразование.)

Правило состоит в том, что когда параметр функции участвует в вычете аргумента шаблона, никакие неявные преобразования не допускаются для аргумента, переданного этому параметру. Правила вычета уже скомпилированы, что позволяет некоторые неявные преобразования (т. Е. Для Более широких арифметических типов) сделают их еще более сложными.

Комментарии:

1. Я узнал две причины, почему: 1. это шаблон. template <class T> const Tamp; min (const T amp; a, const T amp; b); 2. неявные преобразования не допускаются. Спасибо.

2. @Swift-FridayPie 1. Я думаю, что если оба параметра имеют разные типы данных, то перегрузка функции невозможна, поскольку мы видим, что обе переменные имеют один и тот же шаблон. 2. тогда вы имели в виду, что когда параметр функции участвует в выводе аргумента шаблона, никакие неявные преобразования не допускаются, поскольку аргумент, переданный этому параметру, является неправильным утверждением?

Ответ №2:

Поскольку при этом возникает ошибка потери точности, они создаются для int типов данных, поэтому вы не можете передать long или что-то в этом роде float . Вы должны неявно приводить их.

Комментарии:

1. std::min это шаблон функции, он не «создан для int »

2. не это. точность имеет что-либо с вычетом параметров или неявными приведениями