在复制构造函数中省略号的含义是什么?
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 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
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 这个省略号在 c++ 中是什么:#define MBGL_DEFINE_ENUM(T,值...)?
- 在复制构造函数中省略号的含义是什么?
- 令牌的含义是什么"... ..."?即参数包上的双省略号运算符