2016-10-05 6 views
2

私が持っている2テンプレート関数と、このプログラム:assign(a,a+b)コール2番目のテンプレート機能 ない理由テンプレートコールが不一致のように見える

#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); 
} 

iは、理解傾けるoperator+に我々は新しいAオブジェクトをcreateingされており、 intパラメータでctorを呼び出します。

constオブジェクトとしてa+bを作成していますか?

+4

非const左辺値、参考文献があるとします。 –

答えて

1

constオブジェクトとして+ bを作成していますか?

いいえ、一時的に作成しています。一時変数は、右辺値参照にバインドされます。あなたは1を持っていないため、コンパイラはconst参照の過負荷をピックアップします

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

(この場合は普遍参照、)「第三」関数でのことを確認することができます。どうして ?

あなたは一時に結合しない

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 ?