Consider following program:
#include <iostream>
struct Test
{
Test(...)
{
std::cout<<"Variadic constructor\n";
}
};
int main()
{
Test t;
t={3,4,5};
}
我认为这是可变参数构造函数。C++标准是否规定构造函数可以是可变参数的?这种构造函数有什么用途?允许可变参数构造函数的理由是什么?
Consider following program:
#include <iostream>
struct Test
{
Test(...)
{
std::cout<<"Variadic constructor\n";
}
};
int main()
{
Test t;
t={3,4,5};
}
我认为这是可变参数构造函数。C++标准是否规定构造函数可以是可变参数的?这种构造函数有什么用途?允许可变参数构造函数的理由是什么?
让我们逐个回答您的问题:
我认为这是变参构造函数。
您是正确的。
C++标准是否说构造函数可以是变参的?
虽然我不是专业人士,但我认为是可以的。为什么不呢?构造函数只是一个(成员)函数。
这种构造函数有什么用处?
和其他变参函数一样 - 用于传递可变数量的参数。它也有相同的问题,主要是没有类型安全性,就像其他任何变参函数一样。例如,假设您需要一个(C)字符串列表,您可以像这样做:在此处查看实时演示here。
#include <iostream>
#include <cstdarg>
struct Test
{
Test(int n,...)
{
va_list va;
va_start(va, n);
for (int i = 0; i < n; ++i) {
char const *s = va_arg(va, char*);
std::cout<<"s=" << s << std::endl;
}
va_end(va);
}
};
int main()
{
Test t{3, "3","4","5"};
}
Test t={"3","4","5", NULL};
为什么要允许变长构造函数?
我猜是因为它与C语言兼容,并且某些情况下可能会有用。如果您熟悉<cstdarg>,那么它可以成为一种有效的工具。当然,使用C++11时,最好使用可变模板/完美转发和初始化列表。但是,在C++98中您没有这些工具。