7

模板化构造函数(如下所示)是否会覆盖隐式复制构造函数?

template <class T>
struct Foo
{
    T data;

    // ...

    template <class U>
    Foo(const Foo<U> &other) : data((T)doSomethingWith(other.data)) {}

    // ...
};

other如果是这样,如果按值而不是常量引用传递,它是否仍会覆盖它?

如果是这样,是否有任何方法可以在不明确定义复制构造函数的情况下解决这个问题?

4

3 回答 3

7

不,那不是复制构造函数。该标准第 12.8 ( [class.copy]) 节要求:

类的非模板构造函数X是复制构造函数,如果它的第一个参数的类型是X&、或,并且要么没有其他参数,要么所有其他参数都有默认参数const X&volatile X&const volatile X&

编译器仍会隐式生成一个默认值。

您可以通过以下方式使其明确(需要 C++11)

Foo(const Foo<T>&) = default;
于 2012-06-13T13:54:50.097 回答
2

模板化构造函数(如下所示)是否会覆盖隐式复制构造函数?

不。复制构造函数仍然是隐式声明的,并且优先于模板选择。

在没有明确定义复制构造函数的情况下有什么办法吗?

不。如果您不想要隐式复制构造函数,那么您必须自己定义一个。

于 2012-06-13T13:55:19.747 回答
2

看起来像模板化的 [默认构造函数/复制构造函数/移动构造函数/复制赋值运算符/移动赋值运算符] 的模板化构造函数或赋值运算符并不是真正的 [默认构造函数/复制构造函数/移动构造函数/复制赋值运算符/移动赋值运算符] 并且不会替换它或阻止它被隐式生成。

于 2012-06-13T13:55:47.863 回答