【问题标题】:Function default argument replacing when redeclaration [duplicate]重新声明时替换函数默认参数[重复]
【发布时间】:2015-01-07 06:17:08
【问题描述】:

为什么下面的代码格式正确:

void foo(int i, int j = 56);
void foo(int i = 42, int j);

int main(){  }

DEMO

但是下面

void foo(int i = 42, int j);
void foo(int i, int j = 56);

int main(){  }

DEMO

格式不正确。我尝试在N4296::8.3.6 [dcl.fct.default] 中查找,发现如下示例:

class C 
{
    void f(int i = 3);
    void g(int i, int j = 99);
};
void C::f(int i = 3) { } //error
void C::g(int i = 88, int j) { // C::g can be called with no argument
}

但是 clang 似乎不是这样的。

struct A
{
    void foo(int i = 42, int j);
};

void A::foo(int i, int j = 56){ }; //error

int main(){  }

DEMO

那么,这是一个实施问题吗?从形式上讲,所有这些例子都应该是可以接受的,不是吗?

【问题讨论】:

  • 默认参数应该按照标准从右到左在函数中声明...

标签: c++ function default-arguments


【解决方案1】:

[dcl.fct.default]

  1. [...]默认参数可以添加到相同范围内函数的后续声明中。
void foo(int i, int j = 56);
void foo(int i = 42, int j);

这很好,因为第二个声明为第一个参数添加了一个默认参数,而之前没有。

[...]在给定的函数声明中,带有默认参数的参数后面的每个参数都应在此或之前的声明中提供一个默认参数[...]

第二个声明中的第二个参数已经有一个默认参数,尝试提供另一个参数会出错。

void foo(int i = 42, int j); // error
void foo(int i, int j = 56);

这是一个错误,因为第一个声明为第一个参数提供了默认参数,但没有为第二个参数提供默认参数,并且没有与第一个示例不同的先前声明。

struct A
{
    void foo(int i = 42, int j); // the error should be here
};

void A::foo(int i, int j = 56){ }; // not here

由于与上述完全相同的原因,这是不正确的,j 在初始声明中没有默认参数,示例中的下一行无关紧要。

【讨论】:

  • 你说的很清楚。谢谢你的回答!关键是一旦你声明了一个默认参数,所有其余的子序列参数也应该有默认值。
猜你喜欢
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
  • 2021-08-29
  • 2016-07-03
  • 2013-05-02
相关资源
最近更新 更多