2013-08-01 41 views
-1

在(現有的)代碼中,使用了一個共享指針實現「xBinSp」,它與std :: shared_ptr類似。有一些方法定義爲將NULL共享指針交給引用?

setBinaryValue(xBinSp &bin); 

其中這樣的共享指針對象必須被移交。現在有些情況下,NULL(意味着xBinSp())將不得不移交。

調用

setBinaryValue(xBinSp()); 

導致一個警告

警告C4239:使用非標準擴展: '參數':從 'xBinSp' 轉換爲 'xBinSp &'

所以我的問題:如何我可以正確地交出「NULL」的東西 - 就像這種情況下,當方法期望引用這樣的共享指針嗎?創建自己的變量和使用它似乎是一些浪費資源給我...

謝謝!

+0

我只是通過'xBinSp'。 –

+0

我看到答案中解釋了機制,但爲什麼根本不調用函數。它有其他副作用,然後修改參數? – Marius

+0

函數HAS將被調用由應用程序本身的邏輯定義,以重置可能早先設置的其他二進制值。所以這是一個合法的狀態,將二進制數據(即空指針又名空共享指針)交給這個方法。 – Elmi

回答

1

,你可以創建功能的過載零個參數:

void setBinaryValue() { 
    xBinSp bin; 
    setBinaryValue(bin); 
} 

的電話本一個空值。

2

這是因爲當你調用函數與xBinSp()您正在創建一個臨時值將盡快函數調用完成銷燬,並作爲函數想要一個參考,你給的功能,這是一個參考臨時值。

最簡單的解決方法是聲明函數採取const參考:

setBinaryValue(const xBinSp & bin); 

如果你不能做到這一點,那麼你必須創建一個非臨時實例,並傳遞給函數:

xBinSp null; 
setBinaryValue(null); 

在這兩種情況下,您都必須注意,該函數不會保存此引用以供將來訪問。

0

,當你想改變自己的價值觀您通過引用傳遞對象:

template <typename T1, typename T2> 
void swap(T1 & t1, T2 & t2) 
{ 
    T1 tmp = t1; 
    t1 = t2; 
    t2 = tmp; 
} 

所以,如果你swap(a,b),函數調用a之後將有b價值,反之亦然。這對臨時工不起作用。

由於C++ 11有解決的辦法 - 右值引用:

template <typename T1, typename T2> 
void swap(T1 && t1, T2 && t2) 
{ 
    T1 tmp = t1; 
    t1 = t2; 
    t2 = std::move(tmp); 
} 
0

編譯器警告你,它使用的是非標準擴展C++的,也就是說,它是有約束力的臨時值(xBinSp())與通常不被允許的非const(xBinSp&)的引用相關聯。

臨時只能綁定到對const的引用,並且它們的生命週期被擴展到它們綁定到的引用的時間。

功能setBinaryValue的名稱意味着(雖然我可能是錯的)它爲它的參數設置了一些值。現在,它認爲把它傳遞給臨時代碼是沒有什麼意義的,因爲當函數返回時它會被銷燬,並且你不能使用這個值。即使您將簽名更改爲const xBinSp&,問題仍然存在。

通過一個名爲左值將是你最好的選擇,國際海事組織。