在复制构造函数中省略号的含义是什么?

What is the meaning of ellipses in a copy constructor?

本文关键字:是什么 省略号 复制 构造函数      更新时间:2023-10-16

考虑以下程序:

#include <iostream>
struct Test
{
    int a;
    Test() : a(3)
    { }
    Test(const Test& t...)
    {
        std::cout<<"Copy constructor calledn";
        a=t.a;
    }
    int get_a()
    {
        return a;
    }
    ~Test()
    {
        std::cout<<"Destructor is calledn";
    }
};
int main()
{
    Test t;
    Test* t1=new Test(t);
    std::cout<<t.get_a()<<'n';
    std::cout<<t1->get_a()<<'n';
    delete t1;
}

仔细观察复制构造函数参数中的三个点当我尝试这个程序时,我真的很惊讶。它有什么用?这是什么意思?

语言规范对此有何规定?

我知道三个点在可变函数中用来表示可变长度的参数如printf()scanf()等,以及C99引入的可变宏。在c++中,如果我没记错的话,它们在可变模板中使用。
这个代码格式良好吗?这个可变复制构造函数可以接受任意数量的参数吗?

编译&在g++ 4.8.1上运行良好&2010毫西弗。

8.3.5 章节中的标准草案[dcl。fct]表示, ......同义,除非...是abstract-declarator (强调我的)的一部分:

[…如果参数声明子句以省略号结束在函数形参包(14.5.3)中,实参的数量应为等于或大于没有参数的数目默认实参和不是函数形参包。,语法正确,其中"…"不是"的一部分抽象声明器,",….[…]

所以这是一个可变函数,据我所知,如果没有额外的参数,这也是一个有效的复制构造函数,从12.8 [class。copy]:

类X的非模板构造函数是复制构造函数,如果其第一个形参类型为X&, const X&, volatile X&或者const volatileX&,或者没有其他参数,或者只有其他参数形参有默认实参(8.3.6)。

这个注释说省略号不是参数

void g(int = 0, ...); // OK, ellipsis is not a parameter so it can follow
                      // a parameter with a default argument

由上面的规范文本支持:

如果参数声明子句以省略号[…]结尾

注意,抽象声明器是一个没有标识符的声明器。

它有什么用?这是什么意思?

是的,它引入了一个可变函数。

在c++中,如果我没记错的话,它们是在可变的模板中使用的。

语法和语义不同。它是一个"c风格"的可变函数,而不是可变模板函数。此外,复制构造函数不能是模板函数。

类X的非模板构造函数是复制构造函数第一个形参类型为X&, const X&, volatile X&或者const volatile,或者没有其他参数,否则所有其他形参有默认实参(8.3.6)。

在最终草案(强调我的)中Per§12.8.2

这个代码格式正确吗?这个可变复制构造函数可以接受任意数量的参数吗?

如果省略号包含参数,则它不再是复制构造函数,而是简单构造函数。如果没有,则它是一个有效的复制构造函数。

 X(const X&, int = 1, double = 5); // copy-ctor
 X(const X&, int = 1, double); // constructor