2012-01-09 64 views
4

我有一個函數,它將一個指針作爲參考參數,但是我無法將&my_variable傳遞給函數。我收到的錯誤是cannot convert parameter from my_class* to my_class*&,使用VS2010。爲什麼我無法傳遞地址作爲參考?

爲什麼不允許?

class my_class 
{ 
public: 
    my_class(); 
    my_class(my_class* &parent); 
}; 

-

int main() 
{ 
    my_class a; 
    my_class b(&a);     // Not legal 

    // --- 
    my_class a; 
    my_class* a_ptr = &a; 
    my_class b(a);     // Legal 

    // --- 
    my_class* a = new my_class; 
    my_class* b = new my_class(a); // Legal 
} 

回答

10
表達

一地址的的結果是一個rvalue。因此,您不能將它綁定到引用到非常量。

這也沒有意義。這就像是說int a; &a = 12;顯然你不能改變變量a的地址。

相反,你要這樣:

int a; 
int * p = &a; 
mutate_me(p); // declared as mutate_me(int * &); 

如果函數需要變異的指針,無論是常量引用或按值傳遞。

+0

有道理。謝謝! – Eric 2012-01-09 20:37:06

1

想想情況,當你喜歡寫東西

void foo(bar*& ptr) { 
    ptr = new bar; 
} 

bar b; 
foo(&b); 
1

通俗地說,希望通過引用參數的方法希望它被傳遞一些可以合法地放置在賦值語句的左側(有時也被稱爲一個「左值」)。

int main() 
{ 
    my_class a; 
    my_class b(&a);     // Not legal: &a = 0; would be illegal because you can't change an address of a variable. 

    // --- 
    my_class a; 
    my_class* a_ptr = &a; 
    my_class b(a_ptr);     // Legal: You've declared a_ptr on the stack and its value (what it points to) can be changed. The address of a_ptr would not be changeable though. 

    // --- 
    my_class* a = new my_class; 
    my_class* b = new my_class(a); // Legal: Again, this is on the stack and `a` could point to something else, but its own address won't be changed. 
} 

在這種情況下,這是值得指出的是,在大多數情況下,按值傳遞一個指針是價格低廉,將工作。如果你確實需要指針是可修改的(通過引用傳遞),那麼你需要傳遞一個左值。

另一個選擇是具有參考是const。那我相信你可以通過rvalues就好了。

相關問題