2016-12-25 1 views
1

하나의 매개 변수로 템플릿 생성자를 사용하려고합니다. 나는 const 매개 변수와 const가 아닌 두 가지 경우를 시도한다.템플릿 생성자 const 매개 변수가 아닌 const 매개 변수

class Foo1 
{ 
public: 
    Foo1() {} 
    template <typename T> 
    Foo1(const T& f) 
    { 
     cout<<"Foo1"<<endl; 
    } 
}; 
class Foo2 
{ 
public: 
    Foo2() {} 
    template <typename T> 
    Foo2(T& f) 
    { 
     cout<<"Foo2"<<endl; 

    } 
}; 

int main() 
{ 
    Foo1 f1; 
    Foo1 f11(f1); 
    Foo2 f2; 
    Foo2 f21(f2); 
} 

출력은 다음과 같습니다 FOO2

그래서 기본 복사 생성자가 FOO1과하지 FOO2 생성됩니다. 그래서 모두 geerated하는 건설 복사

:

int main() 
{ 
    const Foo1 f1; 
    Foo1 f11(f1); 
    const Foo2 f2; 
    Foo2 f21(f2); 
} 

출력이 비어 :

나는에 주요 기능을 변경할 때. 왜 그 행동입니까?

답변

1

그래서 기본 복사 생성자가 Foo1에 대해 생성되고 Foo2에 대해서는 생성되지 않습니다.

틀린. 가 아닌 constFoo2을 통과

생성자가 생성 두 사본

하지만

template <typename T> Foo2(T& f) // with T = Foo2 

, 복사 생성자보다 더 좋은 (정확한) 일치.