以下是“复制构造函数”的定义,引用自[class.copy.ctor/1]:
在这个简单的例子中,两个构造函数都是复制构造函数:
在这个例子中,将打印出
为什么文本中有“非模板”要求?
为什么标准将模板排除在复制构造函数之外?如果类X的非模板构造函数的第一个参数为X&、const X&、volatile X&或const volatile X&,并且要么没有其他参数,要么所有其他参数都有默认参数,则该构造函数是X的复制构造函数。
在这个简单的例子中,两个构造函数都是复制构造函数:
struct Foo {
Foo(const Foo &); // copy constructor
Foo(Foo &); // copy constructor
};
看下面这个类似的例子:
struct Foo {
Foo() = default;
template <typename T>
Foo(T &) {
printf("here\n");
}
};
int main() {
Foo a;
Foo b = a;
}
在这个例子中,将打印出
here
。因此,我的模板构造函数是一个复制构造函数,至少它表现得像一个(它在通常调用复制构造函数的上下文中被调用)。为什么文本中有“非模板”要求?
Foo c = std::move(a);
会发生什么? - Caleth