1

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

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++ 标准中,这种行为是在哪里指定的?

4

2 回答 2

5

永远不要在 var-arg 函数中使用用户定义的类型。使用 C++11 可变参数模板。

如果您的课程不是 pod 类型 - 它未按标准指定,感谢 Vaughn Cato 的评论

n3337 5.2.2/7

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

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

于 2013-02-22T14:45:51.517 回答
3

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

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

于 2013-02-22T15:11:31.560 回答