2013-10-03 151 views
14

我读过该模板copy-con永远不会默认复制onstructor,并且模板assignment-op从不是复制赋值运算符。模板类的复制构造函数

我不明白为什么需要这个限制,并且马上去网上ideone并返回一个test program但这里拷贝构造函数不会被调用关于进一步google搜索,我碰到了模板的构造和尝试,但仍然是永远不会调用拷贝构造函数。

#include <iostream> 
using namespace std; 

template <typename T> class tt 
{ 
    public : 
    tt() 
    { 
     std::cout << std::endl << " CONSTRUCTOR" << std::endl; 
    } 
    template <typename U> const tt<T>& operator=(const tt<U>& that){std::cout << std::endl << " OPERATOR" << std::endl;} 
    template <typename U> tt(const tt<U>& that) 
    { 
     std::cout << std::endl << " COPY CONSTRUCTOR" << std::endl; 
    } 
}; 


tt<int> test(void) 
{ 
    std::cout << std::endl << "  INSIDE " << std::endl; tt<int> a; return a; 
} 

int main() { 
    // your code goes here 
    tt<int> a ; a = test(); 

    return 0; 
} 

有人可以解释我背后的全部原因,以及如何编写模板类的复制构造函数。

感谢

+2

[Copy-elision。](http://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization) – 0x499602D2

+1

没有“默认拷贝构造函数”。只有*一个*拷贝构造函数。模板从来就不是。 –

+0

我编辑的代码,并在ideone中运行它,但仍然复制构造函数不会被调用。但我也无法理解这个限制背后的原因 – anonymous

回答

18

有严格的规定什么是拷贝构造函数(见C++ 11,12.8):

  • 它不是一个模板。

  • 对于一类T,它的第一个参数必须具有类型T &T const &T volatile &T const volatile &

  • 如果它有多个参数,其他参数必须有默认值。

如果你不声明拷贝构造函数,形式T::T(T const &)的拷贝构造函数是隐式声明你。 (它可能实际上也可能不实际定义,如果它被定义,它可能被定义为删除。)

(通常的重载决策规则意味着最多可以有四个拷贝构造函数,每个CV资格)

移动构造函数有类似规则,其中&&代替&

17

我不能,为什么这是怎么回事,但在这里评论是你如何写一个类模板拷贝构造函数和赋值操作符:

template <class T> 
    class A 
    { 
     public: 
     A(const A &){} 
     A & operator=(const A& a){return *this;} 
    }; 

,就是这样。
这里的诀窍是,即使A是一个模板,当您在类内引用它为A(例如在函数签名中)时,它将被视为完整类型A<T>

+1

我发现使用A(const A &){}没有给出错误... – Daniel

+4

@Daniel这是因为'A '也指类的完整类型, 'A'只是你可以在课堂上使用的简写。 – SirGuy

+0

@NicolaiNita这不是说这里第一个评论是什么意思吗? – SirGuy