重新声明时替换函数默认参数
Function default argument replacing when redeclaration
为什么下面的代码是合式的:
void foo(int i, int j = 56);
void foo(int i = 42, int j);
int main(){ }
但以下
void foo(int i = 42, int j);
void foo(int i, int j = 56);
int main(){ }
格式错误。我试图在 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(){ }
那么,这是一个实施问题吗?形式上,所有这些示例都应该是可以接受的,对吗?
[dcl.fct.default]
- [...]default arguments can be added in later declarations of a function in the same scope.
void foo(int i, int j = 56);
void foo(int i = 42, int j);
这很好,因为第二个声明向第一个参数添加了一个默认参数,而该参数以前没有。
[...]In a given function declaration, each parameter subsequent to a parameter with a default argument shall have a default argument supplied in this or a previous declaration[...]
第二个声明中的第二个参数已经有默认参数,尝试提供另一个默认参数会出错。
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
在初始声明中没有默认参数,示例中的下一行无关紧要。
为什么下面的代码是合式的:
void foo(int i, int j = 56);
void foo(int i = 42, int j);
int main(){ }
但以下
void foo(int i = 42, int j);
void foo(int i, int j = 56);
int main(){ }
格式错误。我试图在 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(){ }
那么,这是一个实施问题吗?形式上,所有这些示例都应该是可以接受的,对吗?
[dcl.fct.default]
- [...]default arguments can be added in later declarations of a function in the same scope.
void foo(int i, int j = 56);
void foo(int i = 42, int j);
这很好,因为第二个声明向第一个参数添加了一个默认参数,而该参数以前没有。
[...]In a given function declaration, each parameter subsequent to a parameter with a default argument shall have a default argument supplied in this or a previous declaration[...]
第二个声明中的第二个参数已经有默认参数,尝试提供另一个默认参数会出错。
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
在初始声明中没有默认参数,示例中的下一行无关紧要。