为什么不能在`int`和`long long int`之间使用`std::min`函数?

4

我想知道为什么在min和max函数中无法传递不同数据类型的值。

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

我的疑问是因为我知道编译器可以将较小的数据类型(int)隐式转换为较大的数据类型(long long int),所以为什么编译器在这里不能进行类型转换呢?

抱歉,是的。 - codosopher
1
它们是模板,这就是为什么推导不起作用的原因,因为两个推导变量是有歧义的。请使用显式转换。 - Swift - Friday Pie
我知道这两种变体是不同的,但是如果可能的话,隐式类型转换不是编译器的责任吗? - codosopher
@PaulMcKenzie 不行。起初我认为编译器会将 int 隐式转换为 long long int,因为这是编译器的责任。但是,我错了。 - codosopher
@Swift-FridayPie 收到了,谢谢。 - codosopher
显示剩余5条评论
2个回答

4

这取决于 std::minstd::max 的设计。

它们本可以为两个参数设置不同的类型,然后使用类似std::common_type的东西来确定出一个好的结果类型。但是它们却采用了相同的类型作为两个参数,这就要求你传递的两个参数必须具有相同的类型。

编译器可以将小数据类型(int)隐式转换为大数据类型(long long int)

是的,但它也可以从 long long 隐式地转换回 int。(“转换”不是正确的单词,它意味着显式转换。)

规则是,当函数参数参与模板参数推导时,不允许对传递给该参数的参数进行任何隐式转换。推导规则已经很复杂了,允许一些隐式转换(例如到更宽的算术类型)会使其变得更加复杂。


我已经学到了两个原因:1. 这是一个模板。template <class T> const T& min (const T& a, const T& b); 2. 不允许隐式转换。谢谢。 - codosopher
  1. 我认为如果两个参数具有不同的数据类型,则无法进行函数重载,因为我们可以看到两个变量具有相同的模板。
  2. 那么你的意思是当函数参数参与模板参数推导时,对于传递给该参数的参数不允许隐式转换是错误的陈述?
- codosopher

-3

因为精度丢失错误会在这种情况下发生,它们是为 int 数据类型设计的,因此您不能传递 long 或类似 float 的数据类型。 您必须进行隐式转换。


2
std::min是一个函数模板,它不是“为int而制作的”。 - UnholySheep
精度与参数推断或隐式转换无关。 - Swift - Friday Pie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接