首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::max函数VS '>‘运算符中int和long long int之间的最大值

std::max函数VS '>‘运算符中int和long long int之间的最大值
EN

Stack Overflow用户
提问于 2020-04-12 18:37:51
回答 1查看 121关注 0票数 3

我有两个长整数的向量"a“和"b”,我想把"a“和"b”各自元素的差异放到一个向量"c“中。但我不希望这些差值低于0。

代码语言:javascript
复制
#include<bits/stdc++.h>
using namespace std;

int main(){
    vector<long long int> a={360757931684,484141693549}; 
    vector<long long int> b={186119101678,675563431537};
    vector<long long int> c; 
    vector<long long int> d;

    for (int i=0; i<2; i++){
        // c.push_back(max(0,a[i]-b[i]));
        c.push_back(max(0ll,a[i]-b[i]));
        //I need to use "0ll" to make this work, Because the commented line above doesn't work
    }
    for (int i=0; i<2; i++){
        if (a[i]-b[i]>0)
            //Here this works fine even without "0ll"
            d.push_back(a[i]-b[i]);
        else
            d.push_back(0);
    }
    return 0;
}

在使用std::max函数时,我必须使用0ll,但在使用>运算符时,仅使用0就足够了。为什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-12 18:55:20

这是因为必须为std::max提供两个完全相同类型的参数,而intlong long int是两种不同的类型。如果您编写std::max(0, a[i]-b[i]),它将不会编译,因为a[i]-b[i]的类型是long long int,而0的类型是int

更长的答案:

std::max是一个函数模板。您正在使用的重载有一个模板参数T,以及两个参数const T& aconst T& b。调用std::max时,可以显式指定模板参数,如下所示。

代码语言:javascript
复制
std::max<long long int>(0, a[i]-b[i])

在这种情况下,编译器将生成一个接收两个long long int的函数,您实际上可以将任何可以转换为long long int的内容传递给该函数。

但是,如果您不指定模板参数Ttemplate argument deduction会尝试为您推断它。

下面是它的工作原理。第一个参数是const T& a,因此编译器尝试根据您作为参数传递的内容来推断T。您传递了0,因此编译器推断出T是一个int

然后,编译器尝试使用第二个参数const T& b来推导T。您传递了一个long long int,所以编译器推断T一定是一个long long int

然后,编译器无法实例化函数模板,因为它推导出同一模板参数的冲突类型。

无法使用指定的参数实例化函数模板std::max,编译器无法找到要调用的匹配函数,这就是为什么会出现编译错误。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61170115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档