【问题标题】:Maximum between int and long long int inside std::max function VS '>' operatorstd::max 函数 VS '>' 运算符中 int 和 long long int 之间的最大值
【发布时间】:2020-04-12 10:37:51
【问题描述】:

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

#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,但在使用&gt; 运算符时,仅使用0 就足够了。为什么?

【问题讨论】:

    标签: c++ templates max std


    【解决方案1】:

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

    更长的答案:

    std::max 是一个函数模板。您使用的重载有一个模板参数T,以及两个参数const T&amp; a 和const T&amp; b。调用std::max时,可以像这样显式指定模板参数。

    std::max<long long int>(0, a[i]-b[i])
    

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

    但是,如果你不指定模板参数T,template argument deduction会尝试为你推导出来。

    这是它的工作原理。第一个参数是const T&amp; a,因此编译器会尝试根据您作为参数传递的内容推断T。你传递了0,所以编译器推断T 是int

    然后编译器尝试使用第二个参数const T&amp; b 推导出T。您传递了long long int,因此编译器推断T 必须是long long int。

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

    未能使用指定参数实例化函数模板std::max,编译器无法找到要调用的匹配函数,这就是您收到编译错误的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多