2016-10-05 4 views
2

내가 가지고있는 2 템플릿 기능이 프로그램을 다음 assign(a,a+b) 호출 두 번째 템플릿 함수 않는 이유템플릿 호출이 UNMATCH 것 같다

#include <iostream> 
template <class T> void assign(T& t1,T& t2){ 
    std::cout << "First method"; 
    t1=t2; 
} 
template <class T> void assign(T& t1,const T& t2) { 
    std::cout << "Second method"; 
    t1=t2; 
} 
class A 
{ 
public: 
    A(int a):_a(a){}; 
private: 
    int _a; 
    friend A operator+(const A& l, const A& r); 
}; 
A operator+(const A& l, const A& r) { 
    return A(l._a+r._a); 
} 
int main() 
{ 
    A a=1; 
    const A b=2; 
    assign(a,a+b); 
} 

내가 이해 은어 operator+에서 우리는 새로운 A 객체를 createing하고 int 매개 변수로 ctor를 호출하십시오.

const 개체로 a+b을 생성하고 있습니까?

+4

const가 아닌 좌변의 심판을 가정 해 봅시다. –

답변

1

const 개체로 + b를 생성 중입니까?

아니요, 임시로 만듭니다. 임시 변수는 선행 참조에 바인딩됩니다. 계정이없는 당신이

template <class T> 
void assign(T& t1, T&& t2) { 
    std::cout << "Third method"; 
    t1=t2; 
} 

(이 경우 보편적 참조)는 '세 번째'기능을 확인 할 수 있습니다, 컴파일러는 const를 참조 과부하를 선택합니다. 왜 ?

는 임시직에 결합하지 않는

void add(int & x) 
{ 
    ++x; 
} 
unsigned y = 0; 
add(y); // create a temporary to int 
std::cout << y << "\n"; // what's the value of y ? 
관련 문제