2012-03-06 110 views
0

在搜索解決方案以調用接受左值和右值引用的函數時,我寫了下面的一段代碼(不,我不會再這麼做,我保證)。指向右值的指針

目標是提供一個函數,既接受左值和右值引用,我不想寫兩個函數或真正關心來電方的左值/右值。因此,我想提供一些包含參數的宏/函數,因此無論它是l/rvalue都可以傳遞 - 在本例中爲get_addr。

在任何情況下,我都想改變傳遞給函數的數據。

template<typename T> 
std::shared_ptr<T> get_addr(T t) { 
    std::shared_ptr<T> p(new T(t)); 
    return p; 
} 

int get_value(int x){ 
    return x * 2; 
} 

void print_value(int* p){ 
    cout << *p << endl; 
} 

int main() { 
    print_value(get_addr(get_value(42)).get()); 
} 

儘管該代碼對我來說工作正常,但我懷疑它是否安全。我的猜測:在從shared_ptr調用get()之後,get_value()的結果不再是必需的,可能會被解散。所以,print_value可能會收到無效的引用。那有意義嗎?無論如何,我不喜歡我提供的代碼。我通過使用一個臨時變量解決了這個問題。

不過,我仍然好奇,如果有任何更好的解決方案,這個問題。從語法'的角度來看,我最好只有一個函數「void print_value(int & & p)」,它接受兩個l/rvalues。我看過移動語義,左/右轉換,但沒有找到一個真正看起來不錯的解決方案。

回答

3

在任何情況下,我想改變傳遞給函數的數據。

這是什麼問題呢?

void print_value(int p){ 
    cout << p << endl; 
} 

或以下,如果你不想複製一些昂貴的類型。

void print_value(T const& p){ 
    cout << p << endl; 
} 
+0

是的,這是我的解決方案。雖然這麼簡單,但我沒有看到它。我還沒有意識到只要引用參數被標記爲const,rvalue引用就可以被傳遞。謝謝! – user1034081 2012-03-06 13:44:47

0

首先,你可以採取const T&,它會綁定到l和r值。但更直接地說,「完美轉發」就是解決這個問題的方法。