【问题标题】:Make a function has higher precedence than another使一个函数比另一个函数具有更高的优先级
【发布时间】:2021-09-24 03:16:19
【问题描述】:

所以我有一个函数:

void foo(char a = 'A', int b = 0)
{
    // code
}

我还有一个:

void foo(int b = 0, char a = 'A')
{
    //code
}

然后如果我调用foo(),它会返回一个错误,因为编译器无法决定调用哪个函数。那么我可以创建一个比另一个优先级更高的函数吗?那么如果我调用foo() 那么编译器该选择哪一个呢?

【问题讨论】:

  • 如果你让其中一个具有更高的优先级,那么另一个永远不会被调用,不是吗?那么你为什么要定义第二个呢?
  • @NateEldredge:我认为他们的意思是,当任何一个函数同样可行时,他们只是想要一个决胜局(感谢不带参数调用),但是当带参数调用时,它会选择更合适的功能。
  • @NateEldredge 第二个交换了变量。
  • 你为什么要引入 tie(通过允许不带参数调用任一版本)?情况有点奇怪,因为 you 引入了歧义,而不是消除歧义,您想添加更多内容。
  • 使用显式重载而不是默认参数。例如。 a foo(int b) 将调用 foo(char a, int b),默认 a 为 'A'。这将使您更容易明确(!)您在代码中的含义以及您想要选择的功能(通过一些非常明确的规则)

标签: c++ function c++11 ambiguous


【解决方案1】:

你可能想在这里使用函数重载:

void foo(char a, int b = 0)
{
    // code
}

void foo(int b, char a = 'A')
{
    //code
}

void foo()
{
    foo(0); // Or 'foo('A');', depends on which overload you want to give priority
}

编辑:或者您可以从其中一个重载中删除第一个默认参数:

// Makes the compiler select the first overload when doing 'foo()'
void foo(char a = 'A', int b = 0)
{
    // code
}

void foo(int b, char a = 'A')
{
    //code
}

或者:

// Makes the compiler select the second overload when doing 'foo()'
void foo(char a, int b = 0)
{
    // code
}

void foo(int b = 0, char a = 'A')
{
    //code
}

【讨论】:

  • 啊,应该把它当作另一种选择。如果要使用许多默认参数的组合,也有不缩放的缺点(例如,在这种情况下,只有两个参数,您仍然需要为第二个参数设置默认值,否则您将无法像使用 OP 的函数一样使用单个参数调用它,并且使用更多参数,特别是如果多个参数共享第一个参数的类型,则必须编写许多较短的原型重载,而不仅仅是空重载) ,但它避免了从每个调用站点传递默认值的浪费。
【解决方案2】:

如果在overload resolution 期间发现两者同样可行,则无法对一个函数或另一个函数应用隐式偏好。

如果您遇到这种情况,最好的办法是将这两个函数包装在不同的命名空间中,这样您就可以选择通过命名空间限定的引用访问哪一个。代码的其他部分仍然可以将两者都带入它们自己的查找领域,以便与using 语句一起使用,只要调用是明确的,它们就可以以这种方式不限定使用,程序员会退回到显式命名空间限定当无法解决歧义时。

【讨论】:

    猜你喜欢
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    相关资源
    最近更新 更多