varadic函数-c++变量参数列表

variadic functions - c++ variable argument list

本文关键字:参数 列表 变量 -c++ 函数 varadic      更新时间:2023-10-16

我正在寻找答案,但找不到任何相关信息。举个例子:

class MyClass
{
    //member functions and variables
};
void foo(int pivot,...)
{
    va_list arguments;  
    va_start(arguments,pivot);
    //va_arg(arguments,???)
    va_end(arguments);
}
void bar()
{
    MyClass a;
    MyClass * b = &a;
    const MyClass & c = a;
    foo(0,a,b,c);
}

参数abc是如何传递的?通过价值,还是通过参考,以及如何使用va_arg要求它们?MyClass的构造函数/析构函数呢?在c++标准中,这种行为在哪里被指定?

您不应该在var arg函数中使用用户定义的类型。使用C++11可变模板。

如果你的类不是pod类型的-标准中没有指定,感谢Vaughn Cato的备注

n3337 5.2.2/7

传递类类型(子句9)的潜在求值参数,该参数具有非平凡复制构造函数、非平凡的移动构造函数或非平凡的析构函数,没有相应的参数,由实现定义的语义有条件地支持

否则,你可以,也会是正确的,但你不应该。

按值。但要注意,如果MyClass不是POD,程序具有未定义的行为(C++03,§5.2.2./7),或者如果MyClass具有非平凡的复制构造函数、移动构造函数或析构函数,该操作是有条件支持的,带有实现定义的语义(C++11,§5.2.2./7)。

在您的示例中,传递a和传递c正是相同的操作(除了c不能绑定到非常常量引用,但这不是问题,因为varargs都是按值传递的)。因此,当调用foo时传递0a的副本、指针b的副本和副本CCD_ 13。为了在foo中访问它们,您需要声明va_arg中的类型为intMyClassMyClass*MyClass