繁体   English   中英

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

[英]Is it possible to use default arguments and a variable number of arguments in a single function?

例如,像这样:

#include <cstdarg>

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

上面的代码在 C++ 中到底是什么意思? 它在 G++ 中编译良好。 请注意,我无法想象在任何情况下这都会有用,甚至无法想象它应该做什么。 我只是好奇。

void my_function(int it=42, ...)

你说这个 function 与 GCC 编译得很好,但是你不能使用默认参数,你还必须传递所谓的默认参数的参数,才能使用这个 ZC1C425268E683845D1AB5ZA。

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

问你自己:

第一个参数898是对应于it的参数还是对应于可变参数(并且您打算it使用默认值42 )?

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

顺便说一句,@Johannes 指出了一个好点:您可以简单地调用my_function()而不传递任何参数。 这是我看到的唯一可以使用默认参数的实例。


现在,如果您更改默认参数的 position,如下所示:

void f(..., int p = 10); //illegal

那么这首先在 C++ 中是非法的。

再次问自己:如果允许,那么您可以将其称为:

f(9879, 97897, 7897);

最后一个参数7897是对应于参数p还是对应于可变参数(并且您打算对p使用默认值10 )?

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

是的,这个 function 声明在技术上没有任何问题,尽管我不推荐这种做法,因为在调用 function 时很容易犯错误,编译器无法警告。

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

您可以在命名参数之外提供 arguments,以便填充变量参数列表,在这种情况下,将不使用默认 arguments。

正如您所指出的,是否存在实际有用的实际情况是另一个问题。

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

那么该代码应该完全按照它的样子做。 传递的第一个参数(如果有)是参数it ,rest 是... 因此,如果您不传递任何参数,那么您的it参数将被分配默认值 (42),并且it (等于 42)是传递给 function 的唯一参数。

像在类似情况下使用... -terminated argument-list 的任何其他用法一样,这样的代码可能很有用(并且风险具有相同的性质)。

例子:

您可以创建 function:

// DECLARATION:
// returns vector filled with items specified
std::vector<float> float_vector( size_t item_count = 0, ... /* floats */ );

// DEFINITION:
std::vector<float> float_vector( size_t item_count, ... )
{
    std::vector<float> vec;
    va_list ap;

    va_start(ap, item_count);
    for( ; item_count > 0; --item_count )
    {
        vec.push_back( va_arg(ap,float) );
    }
    va_end(ap);
    return vec;
}

显然float_vector()返回空向量,因为它等同于float_vector(0) 在所有其他情况下, float_vector的行为与通常的 function 类似,但具有可变数量的 arguments。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM