2016-10-05 95 views
2

我有這個程序有2模板功能:模板調用似乎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); 
} 

我無法理解爲什麼用assign(a,a+b)調用中的第二模板函數 ,在operator+我們createing新A對象,用int參數調用ctor。

它創建a+b作爲const對象?

+4

非const左值裁判不綁定到臨時對象。 –

回答

1

它創建一個+ b作爲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 ? 
相關問題