重新声明时替换函数默认参数
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
}
但叮当似乎不是这样。
struct A
{
void foo(int i = 42, int j);
};
void A::foo(int i, int j = 56){ }; //error
int main(){ }
演示
那么,这是一个实施问题吗?从形式上讲,所有这些例子都应该是可以接受的,不是吗?
[dcl.fct.default]
- [...]默认参数可以添加到同一作用域中函数的后续声明中。
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
初始声明中没有默认参数,则示例中的下一行无关紧要。
相关文章:
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 用符号版本替换对函数的所有调用
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 用矩阵将函数中的整数值替换定义的常量
- 函数模板实例化、替换和重载解析的顺序是什么?
- 为表示一个或多个操作的C++函数的int参数寻找类型安全的替换
- 仅当一个参数中未使用 std::function 时,模板函数替换才有效
- 为什么数组中对象的析构函数在被另一个对象替换时不被调用?
- 如何使替换 c 函数的变量名成为错误?
- hstrerror() 的替换函数
- 重新声明时替换函数默认参数
- C++字符串替换函数无限循环
- 如何在c++中替换函数调用的所有实例
- 用C++模板替换函数调用的C宏
- 使用字符串替换函数将字符串的一部分替换为初始化的变量
- 字符串替换函数c++
- 使用默认类型替换c++函数引用模板错误
- 在Std::to_string替换函数中无法识别Std::stringstream对象
- c++中的替换函数
- 替换函数'operator new'不能声明'inline' [-werror,-winline-new-delete]