考虑以下程序:
#include <iostream>
struct Test
{
int a;
Test() : a(3)
{ }
Test(const Test& t...)
{
std::cout<<"Copy constructor called\n";
a=t.a;
}
int get_a()
{
return a;
}
~Test()
{
std::cout<<"Destructor is called\n";
}
};
int main()
{
Test t;
Test* t1=new Test(t);
std::cout<<t.get_a()<<'\n';
std::cout<<t1->get_a()<<'\n';
delete t1;
}
仔细观察复制构造函数参数中的三个点
当我尝试这个程序时,我真的很惊讶。它有什么用呢?这是什么意思?
语言规范对此有何规定?
我知道三个点用于表示可变长度函数中的可变长度参数
喜欢printf()
and scanf()
等等以及 C99 引入的可变参数宏。在 C++ 中,如果我没记错的话,它们被用在可变参数模板中。
这段代码格式正确吗?这个可变参数复制构造函数可以接受任意数量的参数吗?
它在 g++ 4.8.1 和 MSVC 2010 上编译并运行良好。
标准草案第8.3.5
[dcl.fct] says , ...
是同义词...
unless ...
是抽象声明符的一部分(强调我的):
[...]如果参数声明子句以省略号终止
或函数参数包(14.5.3),参数数量应
等于或大于不具有的参数数量
默认参数,不是函数参数包。在哪里
语法正确,并且“...”不属于
抽象声明符,“, ...”与“...”同义.[...]
所以它是一个可变参数函数 https://stackoverflow.com/q/1657883/1708801据我所知,在没有额外参数的情况下,这也是一个有效的复制构造函数,来自部分12.8
[类.副本]:
类 X 的非模板构造函数是复制构造函数,如果其
第一个参数的类型为 X&、const X&、易失性 X& 或 const 易失性
X&,或者没有其他参数,或者所有其他参数
参数有默认参数 (8.3.6)。
这个注释说省略号不是参数:
void g(int = 0, ...); // OK, ellipsis is not a parameter so it can follow
// a parameter with a default argument
上面的规范性文本支持了这一点:
如果参数声明子句以省略号终止[...]
请注意,因为有人问抽象声明符是一个没有标识符的声明符。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)