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 ++中编译得很好.请注意,我无法想象任何有用的情况,甚至它应该做的事情.我只是好奇.
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,或者相当于一个可变参数(你打算使用默认值42的it)?
编译器无法知道你的意图!
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,或者相当于一个可变参数(你打算使用默认值10的p)?
在这种情况下,编译器也无法知道您的意图.
是的,这个函数声明在技术上没有任何错误,虽然我不推荐这种做法,因为在调用函数时编译器无法提出错误会很容易出错.
您可以在具有默认参数的第一个参数处停止提供参数.如果让默认参数接管,那么变量参数列表当然是空的.
您可以提供超出命名参数的参数,以便填充变量参数列表,在这种情况下,不会使用任何默认参数.
如你所示,另一个问题是,实际情况是否真的有用.