是否可以在单个函数中使用默认参数和可变数量的参数?

Ale*_*dro 10 c++ variadic-functions default-arguments

例如,像这样:

#include <cstdarg>

void my_function(int it=42, ...)
{
     /* va_list/start/arg/end code here */
}
Run Code Online (Sandbox Code Playgroud)

上面的代码究竟在C++中意味着什么?它在G ++中编译得很好.请注意,我无法想象任何有用的情况,甚至它应该做的事情.我只是好奇.

Naw*_*waz 6

void my_function(int it=42, ...)
Run Code Online (Sandbox Code Playgroud)

你说这个函数用GCC编译得很好,但你不能使用默认参数,你也必须传递所谓的默认参数的参数,才能使用这个函数.

my_function("string", 98, 78, 99); //error
my_function(898, "string", 98, 78, 99); //ok, but the param 'it' becomes 898
Run Code Online (Sandbox Code Playgroud)

问你自己:

是第一个参数898所对应的参数it,或者相当于一个可变参数(你打算使用默认值42it)?

编译器无法知道你的意图!

BTW @Johannes指出了一个好点:你可以简单地打电话my_function()而不通过任何争论.这是我可以使用默认参数时看到的唯一实例.


现在,如果您更改默认参数的位置,请执行以下操作:

void f(..., int p = 10); //illegal
Run Code Online (Sandbox Code Playgroud)

那么在C++中开始这是非法的.

再次问问自己:如果允许,那么你可以称之为:

f(9879, 97897, 7897);
Run Code Online (Sandbox Code Playgroud)

是最后一个参数7897所对应的参数p,或者相当于一个可变参数(你打算使用默认值10p)?

在这种情况下,编译器也无法知道您的意图.

  • 我发现C++ 03标准中没有任何地方说这个声明是非法的.在C++ 11中,它似乎是合法的:第8.3.6节"默认参数"的例子说`void g(int = 0,...); //好的,省略号不是参数,因此它可以跟随带有默认参数`的参数.你的回答似乎误导了我. (3认同)
  • 为什么不可能说`my_function();`?另外,你似乎在最后一行说声明是有效的,但在答案的第一部分说你不能声明`my_function`.你能澄清一下吗? (2认同)

CB *_*ley 5

是的,这个函数声明在技术上没有任何错误,虽然我不推荐这种做法,因为在调用函数时编译器无法提出错误会很容易出错.

您可以在具有默认参数的第一个参数处停止提供参数.如果让默认参数接管,那么变量参数列表当然是空的.

您可以提供超出命名参数的参数,以便填充变量参数列表,在这种情况下,不会使用任何默认参数.

如你所示,另一个问题是,实际情况是否真的有用.