C++中变长构造函数的作用是什么?

4

Consider following program:

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

我认为这是可变参数构造函数。C++标准是否规定构造函数可以是可变参数的?这种构造函数有什么用途?允许可变参数构造函数的理由是什么?


5
所以你不必编写多个构造函数。顺便说一下,这个构造函数并不是非常有用,它没有提供有关参数实际含义的任何信息。 - Mr Lister
4
为了第一个问题:函数可以是可变参数的,构造函数也是一种函数。为什么构造函数不能是可变参数的? - lisyarus
1
@MrLister:如果您能举一个例子来解释它的有用性,那会更好。 - Destructor
9
现在我们有了可变参数模板,varargs方法基本上已经没什么用处了。因为它缺乏类型安全性等问题。 - Ben Voigt
2
Pravasi Meet,但正如@lisyarus所说,可变参数构造函数与任何其他可变参数函数一样有用。您真的在询问可变参数函数的用途吗? - Mr Lister
1个回答

7

让我们逐个回答您的问题:

我认为这是变参构造函数。

您是正确的。

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"};
}

请记住,为了使此功能可用,您至少需要一个“非变参”参数。因此,在可移植的C++代码中,像您展示的纯变参构造函数并没有太多意义。对于任何特定平台,即使没有非变参参数,您可能也知道如何访问参数,因此这可能会起作用:
     Test t={"3","4","5", NULL};

为什么要允许变长构造函数?

我猜是因为它与C语言兼容,并且某些情况下可能会有用。如果您熟悉<cstdarg>,那么它可以成为一种有效的工具。当然,使用C++11时,最好使用可变模板/完美转发和初始化列表。但是,在C++98中您没有这些工具。


很棒的答案和清晰的解释。 - Destructor
你的代码存在编译错误。(请查看实时演示 http://ideone.com/VkQmwx )变量 va 应该是 va_list 而不是 va_arg。(请查看可运行的代码 http://ideone.com/nS2Kuw ) - Destructor
1
@PravasiMeet 谢谢,我本应该检查一下的,但那更多是一个示例而不是演示,所以就疏忽了... - srdjan.veljkovic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接