2012-07-04 66 views
1

在下面的代碼,在該行行爲接受const引用

A(A& b)

當使用該編譯器給誤差作爲

c110.cpp:41:錯誤:調用沒有匹配的功能'A :: A(A)'

c110.cpp:8:注意:考生分別是:A :: A(A &)

但只要我把它轉換成

A(const A& b)

許多許多thanx提前

沒有錯誤出現。爲什麼這樣?

Code 
class A 
{ 
    public: 
    static int cnt; 
    A(A& b) 
    { 
     cnt++; 
     cout<<"cnt="<<cnt<<endl; 
    } 
    A() 
    { 
     cnt++; 
     cout<<"cnt="<<cnt<<endl; 
    } 
    ~A() 
    { 
     cnt--; 
     cout<<"cnt="<<cnt<<endl; 
    } 
}; 



    int A :: cnt=0; 


    A fun(A b) 
    { 
    return b; 
    } 


int main() 
{ 
    A a; 
    A b=fun(a); 
    return 0; 
} 

回答

10

const引用無法綁定到臨時對象。如果您通過臨時參數,A&是非法的,但不是const A&

A b=fun(a); 

做複製初始化由fun(a)返回的對象,這是一個暫時上。

此外,複製構造函數不應該採取非const引用,因爲從邏輯上講,您不需要修改您正在複製的對象。

+0

但是在C++函數中,當返回值時不是創建臨時函數,而是傳遞了b的地址,它是用函數 – Luv

+0

中的b變量複製構建的。我認爲它是RVO(返回值優化),是不是需要放置在這裏? – Luv

+2

@Luv它可以也可能會。但沒關係。僅僅因爲它不使用某些東西並不意味着它不必被正確定義。 –

0

因爲RVO可能發生與否,它的編譯器依賴於它,所以我認爲它始終可以安全地使用A(const A &)類型的語法來進行復制構造而不是A(A &)。

正如上面的問題,RVO沒有發生並且暫時創建,因此A(const A &)可以安全使用。

+0

如果RVO正在發生,它*無關緊要。像其他優化一樣,不管編譯器如何,它都不會影響程序的有效性。 – molbdnilo

相關問題