重新声明时函数默认参数替换

时间:2015-01-07 06:17:08

标签: c++ function default-arguments

为什么以下代码格式正确:

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

那么,这是一个实施问题吗?在形式上,所有这个例子都应该是可接受的,如果它们?

1 个答案:

答案 0 :(得分:1)

[dcl.fct.default]

  
      
  1. [...]默认参数可以在稍后的同一范围内的函数声明中添加。
  2.   
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在初始声明中没有默认参数,示例中的下一行无关紧要。