函数签名中没有名称的默认参数的用例是什么

What is the use case for default argument without name in the function signature

提问人:Daemon 提问时间:8/16/2023 最后编辑:273KDaemon 更新时间:8/16/2023 访问量:150

问:

摘自 cpp 参考文献,https://en.cppreference.com/w/cpp/language/default_arguments

void f(int, int = 7); // #2 OK: adds a default

考虑到默认参数没有名称,是否有任何特定的用例对此很有用。

或者我只是在字里行间读了太多,应该理解它只是函数签名声明,在函数定义中必须提供变量名称才能使用函数中的第二个参数。

我期待函数签名中的变量名称。

C++ C++11 默认参数 函数签名

评论

1赞 πάντα ῥεῖ 8/16/2023
为什么不需要在函数签名中命名其他参数?
0赞 LernerCpp 8/16/2023
它被称为宣言.....!!!
1赞 Daemon 8/16/2023
所以基本上它只是声明函数,在定义中,将提供参数的名称以使其有用。
5赞 selbie 8/16/2023
“或者我只是在字里行间读得太多了,应该理解它只是函数签名声明,在函数定义中,必须提供变量名称才能使用函数中的第二个参数。”-正确。
2赞 BoP 8/16/2023
在声明中命名参数是个好主意,因为它可以帮助人类读者。不过,编译器并不在乎。

答:

3赞 Fareanor 8/16/2023 #1

void f(int, int);是一个函数声明,它与函数定义不同。

在声明中,我们(编译器)只需要知道我们声明了一个需要 2 秒并返回 .fintvoid

这里不需要参数的名称,因为我们不引用它们。

但在定义中,这是另一回事。在这种情况下,我们需要指定参数名称才能使用它们。

例如:

// Declaration
void f(int, int);

// Definition
void f(int a, int b)
{
    std::cout << a << ',' << b << '\n';
}

在上面的例子中,如果我们不给它们这些名称,我们就不能在函数定义中使用 and。但在宣言中,我们并不在乎。ab

注意:出于文档目的(或只是为了帮助人类读者)在声明中指定名称可能仍然有用。

注2:实际上,您也可以在定义中省略参数名称,但在这种情况下,您将无法引用它。
当我们计划稍后定义函数体并且不希望在编译时出现“未使用的参数”警告时,有时会使用它(尽管我个人更喜欢保留并注释掉参数名称)。

评论

0赞 Mike Vine 8/16/2023
你的“笔记”让它看起来像是事后才想到的。在声明中不包括这些名字是非常愚蠢的,而且通常毫无意义。我很少看到他们不。你的回答应该是“请包括它们”,然后说出为什么你可以跳过它们,而不是相反。
0赞 Fareanor 8/16/2023
@MikeVine 是的,我后来添加了注释。这是为了明确答案的重点是解释为什么没有必要在声明中包括这些名字。我想明确指出,虽然它不是必需的,但它仍然出于其他原因(可维护性、文档等)有用。
1赞 Peter 8/16/2023
如果未使用未命名的参数(但该参数是将在函数的未来更新中使用的参数的占位符),则可以在函数定义中具有未命名的参数。大多数编译器(可以配置为)在功能块中未使用命名参数时发出警告,并且不命名参数是故意抑制该警告的一种方法。
0赞 Fareanor 8/16/2023
@Peter 是的,我知道这一点,但我没有考虑提及它,因为这不是 OP 的重点。但为了完整起见,我会添加它。
0赞 Peter 8/17/2023
@Fareanor 没问题。我发表评论是为了完整起见,并不是说你不知道。
0赞 Jesper Juhl 8/16/2023 #2

您可以在函数声明中省略参数名称。编译器只需要知道该函数需要两个 s,并且其中一个具有默认值。如果定义中需要参数,则需要提供名称。 但是,在某些用例中,您甚至可以省略定义中的参数。int

也许有点做作,但一个例子可能是一个函数,它过去只接受一个参数,现在可以接受两个参数,但您希望保持旧代码编译,并且第二个参数是可选的,并且尚未实现第二个参数的使用。在这种情况下,您可以首先使用一些合理的默认值将第二个参数添加到函数签名中,人们现在可以开始使用两个参数调用函数,并且像往常一样只有一个参数,然后在将来扩展您的实现以实际使用(并因此命名)函数定义中的第二个参数。

3赞 machine_1 8/16/2023 #3

参数名称在函数声明和函数定义中都不是必需的。

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