【发布时间】:2015-12-29 21:27:56
【问题描述】:
考虑以下程序:
#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() 和scanf() 等以及C99 引入的可变参数宏。在 C++ 中,如果我没记错的话,它们是在可变参数模板中使用的。
这段代码格式正确吗?这个可变参数复制构造函数可以接受任意数量的参数吗?
它在 g++ 4.8.1 和 MSVS 2010 上编译和运行良好。
【问题讨论】:
-
同
Test(const Test& t, ...)(注意逗号) -
任何可以使用类型本身的一个值调用并通过引用获取它的构造函数都是可能的复制构造函数。可以提供可选的进一步参数这一事实并不重要。
-
@PiotrSkotnicki:那么,为什么不需要逗号?
-
@PravasiMeet 我认为语言规范明确允许这样做。我不确定为什么他们明确允许这样做,但他们确实允许。
-
我更新了我的答案,解释了什么是抽象声明符。
标签: c++ copy-constructor variadic-functions