Рассмотрим следующую программу:
#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. В С++, если я не ошибаюсь, они используются в вариативных шаблонах.
Является ли этот код хорошо сформированным? Является ли этот конструктор вариационной копии, который может принимать любое количество аргументов?
Он компилируется и работает отлично на g++ 4.8.1 и MSVS 2010.