提问人:Daemon 提问时间:8/16/2023 最后编辑:273KDaemon 更新时间:8/16/2023 访问量:150
函数签名中没有名称的默认参数的用例是什么
What is the use case for default argument without name in the function signature
问:
摘自 cpp 参考文献,https://en.cppreference.com/w/cpp/language/default_arguments
void f(int, int = 7); // #2 OK: adds a default
考虑到默认参数没有名称,是否有任何特定的用例对此很有用。
或者我只是在字里行间读了太多,应该理解它只是函数签名声明,在函数定义中必须提供变量名称才能使用函数中的第二个参数。
我期待函数签名中的变量名称。
答:
void f(int, int);
是一个函数声明,它与函数定义不同。
在声明中,我们(编译器)只需要知道我们声明了一个需要 2 秒并返回 .f
int
void
这里不需要参数的名称,因为我们不引用它们。
但在定义中,这是另一回事。在这种情况下,我们需要指定参数名称才能使用它们。
例如:
// Declaration
void f(int, int);
// Definition
void f(int a, int b)
{
std::cout << a << ',' << b << '\n';
}
在上面的例子中,如果我们不给它们这些名称,我们就不能在函数定义中使用 and。但在宣言中,我们并不在乎。a
b
注意:出于文档目的(或只是为了帮助人类读者)在声明中指定名称可能仍然有用。
注2:实际上,您也可以在定义中省略参数名称,但在这种情况下,您将无法引用它。
当我们计划稍后定义函数体并且不希望在编译时出现“未使用的参数”警告时,有时会使用它(尽管我个人更喜欢保留并注释掉参数名称)。
评论
您可以在函数声明中省略参数名称。编译器只需要知道该函数需要两个 s,并且其中一个具有默认值。如果定义中需要参数,则需要提供名称。
但是,在某些用例中,您甚至可以省略定义中的参数。int
也许有点做作,但一个例子可能是一个函数,它过去只接受一个参数,现在可以接受两个参数,但您希望保持旧代码编译,并且第二个参数是可选的,并且尚未实现第二个参数的使用。在这种情况下,您可以首先使用一些合理的默认值将第二个参数添加到函数签名中,人们现在可以开始使用两个参数调用函数,并且像往常一样只有一个参数,然后在将来扩展您的实现以实际使用(并因此命名)函数定义中的第二个参数。
参数名称在函数声明和函数定义中都不是必需的。
void f(int, int = 7);
int main()
{
f(1);
return 0;
}
void f(int, int)
{
return;
}
编译无错误...
但是,如果要使用参数,则必须为它们命名才能引用它们。
使用函数声明时,您不引用参数,但为它们命名对您和代码的读者都很有用;编译器不在乎。
在函数定义中是引用参数的地方,因此这里是必须为它们提供名称的地方:
#include <iostream>
void f(int, int = 7);
int main()
{
f(1);
return 0;
}
void f(int a, int b)
{
std::cout << b << std::endl;
return;
}
输出: 7
评论