在C++中使用可变参数构造函数有什么用?

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++标准是否说构造函数可以是可变参数?这种构造函数有什么用?允许可变参数构造函数的基本原理是什么?

srd*_*vic 7

让我们一个接一个地回答你的问题:

我认为它是可变构造函数.

你是对的.

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,您没有这些工具.