复制构造函数中的省略号是什么意思?
What is the meaning of ellipses in a copy constructor?
考虑以下程序:
#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 上编译和运行良好。
8.3.5
[dcl.fct] 部分的草案标准说 , ...
与 ...
同义,除非 ...
是抽象声明符的一部分(强调我的):
[...]If the parameter-declaration-clause terminates with an ellipsis
or a function parameter pack (14.5.3), the number of arguments shall
be equal to or greater than the number of parameters that do not have
a default argument and are not function parameter packs. Where
syntactically correct and where “...” is not part of an
abstract-declarator, “, ...” is synonymous with “...”.[...]
所以它是一个 variadic function,据我所知,没有额外的参数,这也是一个有效的复制构造函数,来自 12.8
[class.copy 部分]:
A non-template constructor for class X is a copy constructor if its
first parameter is of type X&, const X&, volatile X& or const volatile
X&, and either there are no other parameters or else all other
parameters have default arguments (8.3.6).
并且这条注释说省略号不是参数:
void g(int = 0, ...); // OK, ellipsis is not a parameter so it can follow
// a parameter with a default argument
上面的规范性文本支持:
If the parameter-declaration-clause terminates with an ellipsis[...]
注意,因为有人问 抽象声明符 是没有标识符的声明符。
What is the use of it? What does it mean?
是的,它引入了可变参数函数。
In C++ If I am not wrong they are used in variadic templates.
语法和语义不同。这是一个 "C-style" 可变参数函数,而不是可变参数 template 函数。此外,复制构造函数不能是模板函数。
A non-template constructor for class X is a copy constructor if its
first parameter is of type X&, const X&, volatile X& or const volatile
X&, and either there are no other parameters or else all other
parameters have default arguments (8.3.6).
根据最终草案中的 §12.8.2(强调我的)
Is this code well formed? Is this variadic copy constructor that can take any number of arguments?
如果省略号中包含参数,则它不再是复制构造函数而是简单构造函数。如果没有,则它是一个有效的复制构造函数。
X(const X&, int = 1, double = 5); // copy-ctor
X(const X&, int = 1, double); // constructor
考虑以下程序:
#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 上编译和运行良好。
8.3.5
[dcl.fct] 部分的草案标准说 , ...
与 ...
同义,除非 ...
是抽象声明符的一部分(强调我的):
[...]If the parameter-declaration-clause terminates with an ellipsis or a function parameter pack (14.5.3), the number of arguments shall be equal to or greater than the number of parameters that do not have a default argument and are not function parameter packs. Where syntactically correct and where “...” is not part of an abstract-declarator, “, ...” is synonymous with “...”.[...]
所以它是一个 variadic function,据我所知,没有额外的参数,这也是一个有效的复制构造函数,来自 12.8
[class.copy 部分]:
A non-template constructor for class X is a copy constructor if its first parameter is of type X&, const X&, volatile X& or const volatile X&, and either there are no other parameters or else all other parameters have default arguments (8.3.6).
并且这条注释说省略号不是参数:
void g(int = 0, ...); // OK, ellipsis is not a parameter so it can follow // a parameter with a default argument
上面的规范性文本支持:
If the parameter-declaration-clause terminates with an ellipsis[...]
注意,因为有人问 抽象声明符 是没有标识符的声明符。
What is the use of it? What does it mean?
是的,它引入了可变参数函数。
In C++ If I am not wrong they are used in variadic templates.
语法和语义不同。这是一个 "C-style" 可变参数函数,而不是可变参数 template 函数。此外,复制构造函数不能是模板函数。
A non-template constructor for class X is a copy constructor if its first parameter is of type X&, const X&, volatile X& or const volatile X&, and either there are no other parameters or else all other parameters have default arguments (8.3.6).
根据最终草案中的 §12.8.2(强调我的)
Is this code well formed? Is this variadic copy constructor that can take any number of arguments?
如果省略号中包含参数,则它不再是复制构造函数而是简单构造函数。如果没有,则它是一个有效的复制构造函数。
X(const X&, int = 1, double = 5); // copy-ctor
X(const X&, int = 1, double); // constructor