C++中可变参数构造函数的用途是什么?

What is the use of variadic constructor in C++?

考虑以下程序:

#include <iostream>
struct Test
{
    Test(...)
    {
        std::cout<<"Variadic constructor\n";
    }
};
int main()
{
    Test t;
    t={3,4,5};
}

我认为它是可变构造函数。 C++ 标准是否说构造函数可以是可变的?这样的构造函数有什么用?允许可变构造函数的理由是什么?

让我们试着一一回答您的问题:

I think it is variadic constructor.

你是对的。

Does the C++ standard says that constructor can be variadic?

IANALL,但是,我认为是的。为什么不?构造函数只是一个(成员)函数。

What is the use of such constructor?

与任何其他可变参数函数一样 - 传递可变数量的参数。它也有同样的问题,主要是 no type safety 与任何其他可变参数函数一样。例如,假设您需要一个 (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"};
}

请记住,要使其正常工作,您至少需要一个 "non-variadic" 参数。所以 "pure variadic" 构造函数,就像你展示的那样,在可移植的 C++ 代码中没有多大意义。对于任何特定平台,您可能知道如何在没有非可变参数的情况下访问参数,因此,这可能有效:

     Test t={"3","4","5", NULL};

What is the rationale for allowing variadic constructor?

"It's C compatible and someone might have a use of it",我猜。如果您熟悉 <cstdarg>,它会是一个有效的工具。当然,对于 C++11,您很可能应该改用可变参数模板/完美转发和初始化列表。但是,对于 C++98,您没有这些工具。