varadic函数-c++变量参数列表
variadic functions - c++ variable argument list
我正在寻找答案,但找不到任何相关信息。举个例子:
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);
}
参数a
、b
和c
是如何传递的?通过价值,还是通过参考,以及如何使用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
时传递0
、a
的副本、指针b
的副本和副本CCD_ 13。为了在foo
中访问它们,您需要声明va_arg
中的类型为int
、MyClass
、MyClass*
和MyClass
。
相关文章:
- 概念中的cv限定符需要表达式参数列表
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题
- 错误 没有与参数列表匹配的重载函数"getline"实例
- std::vector 没有重载函数的实例与参数列表匹配
- 模板参数列表中的 false 在模板初始化期间计算为什么?
- C++模板/别名 - 模板参数列表中参数 1 处的类型/值不匹配
- 构造函数/函数声明参数列表中的统一初始化
- 模板化检查是否存在带有参数列表的类成员函数?
- 如何将类成员方法的参数列表自动填充写入可变参数?
- 带有整数的变量参数列表
- 转发变量参数列表以模拟 std::thread
- 错误:"模板<类_Tp,类_Dp>类 std::unique_ptr"的模板参数列表中参数 1 的类型/值不匹配
- C++-将具有引用的长参数列表重构为结构
- 缺少别名模板C++参数列表
- C++如果两个模板函数都与参数列表匹配,将调用哪个模板
- "extern"声明以及带有和不带参数列表的类模板实例的后续定义
- 使用显式模板参数列表和 [temp.arg.explicit]/3 的函数调用的演绎失败
- 没有函数模板的实例与我不知道为什么的参数列表匹配
- 我可以使用宏自动构建参数列表吗?
- 类成员函数参数列表是否可以依赖于模板参数?