当前位置: 首页 > 知识库问答 >
问题:

重载时参数提升

梁丘柏
2023-03-14

我当时正在研究超载问题,我完全被促销搞糊涂了。我看了SO(函数重载中的隐式转换序列)中的几篇文章,我确信还有一些文章可用,但找不到合适的文章。我也指的是http://www.dcs.bbk.ac.uk/~roger/cpp/week20。htm。我在看Stroustrup的C编程特别版时,看到了下面的解释。

通过在参数表达式的类型和函数的参数(形式参数)之间寻找最佳匹配,可以从一组重载函数中找到要调用的正确版本。为了近似我们关于什么是合理的概念,我们尝试了一系列标准:1精确匹配[2]使用促销匹配;[3] 使用标准转换进行匹配[4]使用用户定义的转换进行匹配[5]使用省略号进行匹配。。。。。。

void print(int);
void print(double);
void print(long);
void print(char);
void h(char c, int i, short s, float f)
{
    print(s); // integral promotion: invoke print(int)
    print(f); // float to double promotion: print(double)
}

我写了下面的代码。我在想,如果我调用值为1的函数,将调用func1(long),因为会发生提升。但我得到了错误消息“error:重载'func1(int)'的调用不明确”。它甚至不使用无符号字符类型的html" target="_blank">变量调用函数。

此外,如果我通过call Func1(3.4f),则调用Func1(双精度)并按照我的期望进行提升。为什么1没有提升为long int,但为什么浮动提升为双精度?发生什么整数提升?

    void func1(unsigned char speed)
    {
        cout<<"Func1 with unsigned char: speed =" << speed <<" RPM\n";
    }

   void func1(long speed)
    {
        cout<<"Func1 with long Int: speed =" << speed <<" RPM\n";
    }

    void func1(double speed)
    {
        cout<<"Func1 with double: speed =" << speed <<" RPM\n";
    }

    int main(void)
    {
        func1(1);
        func1(3.4f);
        return(0);
    }

共有1个答案

彭弘伟
2023-03-14

本标准规定:

[C 11:4.13/1]:(“整数转换秩”)

每个整数类型都有一个整数转换秩,定义如下:

  • […]

这需要您的示例中的歧义。

对于func1(3.4f) ,这只是从浮点到双精度的提升,这是最佳匹配,因为其他两个重载方法具有长字符和无符号字符。

还要检查此表:

其中子句规定:

[conv.fpprom]:(7.7浮点升级)

  • 类型浮动的prvalue可以转换为类型的prvalue。值不变。
  • 这种转换称为浮点提升。

 类似资料:
  • 问题内容: 我已经转换一个到一个通过使用。然后,我尝试将其乘以0.01,但是出现一个错误,提示这是我的代码: 通过阅读其他文章,似乎答案与类型有关。例如,如果将类型设置为Integer,则它将收到类似的错误。我尝试将类型更改为Int,但这似乎无法解决问题。 我也曾尝试设置“海峡”和“pennyCount”作为类型和和的所有组合,和。我的猜测是问题与函数将a转换为an有关。 有人可以帮忙弄清楚问题可

  • 问题内容: 我得到错误: 我也尝试过 和 但 工作良好。正确的语法是什么? 问题答案: 有一个功能:

  • 问题内容: 我收到一个错误 找不到接受提供的参数的’/’的重载 我试图通过做修复: 但随后将getAverage设置为而不是 问题答案: 在Swift中没有这样的隐式转换,因此您必须自己明确地进行转换: 来自 Swift编程语言 :“永远不会将值隐式转换为其他类型。” (部分:快速浏览) 但是您现在使用的是Swift,而不是Objective-C,因此请尝试以更加面向功能的方式进行思考。您的函数可

  • 问题内容: 该代码无法编译,编译器说f含糊。但是我认为第二种方法可以解决什么问题? 问题答案: 这是因为无法确定该方法调用是应调用变量args还是应调用float和变量args。 Java决定以这种方式来调用拓宽>装箱>变量args的方法,但是在这种情况下,两者都具有变量args。 在这种情况下,基本上将char扩展为浮动。 Java基元的扩展顺序为:

  • 这是在参数是重载函数时重载解析如何工作中提到的更复杂的问题? 下面的代码编译起来没有任何问题: 模板参数推导似乎不是一项具有挑战性的任务-只有一个函数接受两个参数。但是,取消注释的模板重载(仍然只有一个参数)会无缘无故地破坏编译。gcc 5. x/6. x和clang 3.9的编译都失败了。 它可以用重载解析/模板参数推导规则来解释,还是应该在这些编译器中被限定为缺陷?

  • 问题内容: 我有一个像这样初始化的数据表: 以后我想做 它工作正常,但现在我想在该请求中发送一些参数。这些参数仅在重新加载时才需要,而在表的初始化中则不需要。我怎么做?谢谢! 问题答案: 选项1- 使用preXhr.dt事件。 看到这里http://datatables.net/reference/event/ 选项2(首选) -使用ajax.data函数。 两种选择都会产生相同的结果。您的服务器