我有两个版本的相同的可变函数,但是一个可以工作,另一个不能工作。我怀疑这是因为一个使用原语类型,而另一个使用std::string。
void test1(int f_num, ...)
{
va_list file_names;
va_start(file_names, f_num);
for(int i=0; i<f_num; i++)
{
string name = string(va_arg(file_names, char*));
cout << name << endl;
}
va_end(file_names);
}
void test2(int f_num, ...)
{
va_list file_names;
va_start(file_names, f_num);
for(int i=0; i<f_num; i++)
{
string name = va_arg(file_names, string);
cout << name << endl;
}
va_end(file_names);
}
int main()
{
test1(3, "Hallo", "you", "people");
test2(3, "Hallo", "you", "people");
}
以上结果将产生以下输出:
Hallo
you
people
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted (core dumped)
因此,第一个函数可以工作,但是第二个函数不能工作。我认为这是因为变量宏不能处理非原语类型,这样的假设正确吗?你能让它处理非限制类型吗?
发布于 2018-06-14 07:41:44
第一部分的答案是,你基本上是正确的。类类型的使用有一些限制,特别是如果它们有一个非平凡的复制构造函数( std::string
有)。它可能在一些实现上工作,而在另一些实现上不起作用。从形式上讲,这是由实现定义的语义有条件地支持的。
第二部分比较难,但也比较简单。这些varargs是旧的C,而不是类型安全的。C++确实有类型安全的变体,通过模板:
template<typename... T>
void test1(T... args)
{
std::cout << ... << args << std::endl;
}
问题是,你需要知道如何解压这些args...
--它们被称为。有几种不同的方法可以对它们进行解包;这种特殊的形式称为折叠表达式。
https://stackoverflow.com/questions/50847671
复制相似问题