Des*_*tor 4 c++ constructor variadic variadic-functions
考虑以下计划:
#include <iostream>
struct Test
{
Test(...)
{
std::cout<<"Variadic constructor\n";
}
};
int main()
{
Test t;
t={3,4,5};
}
Run Code Online (Sandbox Code Playgroud)
我认为它是可变构造函数.C++标准是否说构造函数可以是可变参数?这种构造函数有什么用?允许可变参数构造函数的基本原理是什么?
让我们一个接一个地回答你的问题:
我认为它是可变构造函数.
你是对的.
C++标准是否说构造函数可以是可变参数?
IANALL,但是,我想是的.为什么不?构造函数只是一个(成员)函数.
这种构造函数有什么用?
像任何其他可变参数函数一样 - 传递可变数量的参数.它也有同样的问题,大多数没有 任何其他可变函数的类型 安全性.例如,假设你需要一个(C)字符串列表,你可以在这里查看现场演示.
#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"};
}
Run Code Online (Sandbox Code Playgroud)
请记住,要使其工作,您至少需要一个"非变量"参数.因此,像你所展示的那样,"纯可变参数"构造函数在可移植C++代码中没有多大意义.对于任何特定平台,即使没有非变量参数,您也可能知道如何访问参数,因此,这可能有效:
Test t={"3","4","5", NULL};
Run Code Online (Sandbox Code Playgroud)
允许可变参数构造函数的基本原理是什么?
"它与C兼容,有人可能会使用它",我想.如果你了解自己的方式<cstdarg>,它可以是一个有效的工具.当然,对于C++ 11,您最有可能使用可变参数模板/完美转发和初始化列表.但是,使用C++ 98,您没有这些工具.