2016-08-18 141 views
3

如果我有这样的是否有可能拥有默认的拷贝构造函数和模板化的转换构造函数?

template <typename T> 
class MyClass 
{ 
    T myData; 

public: 
    T getValue() { return myData; }   

    template <typename V> 
    MyClass(const MyClass<V>& other) : 
     myData((T) other.getValue()) 
    { 
    } 
}; 

类这就意味着,我提供一个拷贝构造函数(为V = T),从而根据这个链接Why no default move-assignment/move-constructor?我不明白默认构造函数移动等

有没有办法让模板化的构造函数只能用作转换构造函数,所以对于V!= T?

+0

你的类没有用户定义的拷贝构造函数。复制构造函数永远不是模板。 –

回答

5

你的前提是错误的。构造函数模板永远不会用于实例化复制(或移动)构造函数。换句话说,即使成员函数模板可以生成具有适当的复制/移动签名的构造函数,复制/移动构造函数也始终是非模板成员函数。

因此,除了模板之外,您的类仍然具有普通的复制构造函数。

+0

出于兴趣,如果我们明确地'删除拷贝构造函数,那么模板将被用于它的位置? – Bathsheba

+3

@Bathsheba我非常怀疑这一点。删除的函数存在,所以它仍然会被选中。这只是它的使用不健全。 – Angew