在搜索解決方案以調用接受左值和右值引用的函數時,我寫了下面的一段代碼(不,我不會再這麼做,我保證)。指向右值的指針
目標是提供一個函數,既接受左值和右值引用,我不想寫兩個函數或真正關心來電方的左值/右值。因此,我想提供一些包含參數的宏/函數,因此無論它是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。我看過移動語義,左/右轉換,但沒有找到一個真正看起來不錯的解決方案。
是的,這是我的解決方案。雖然這麼簡單,但我沒有看到它。我還沒有意識到只要引用參數被標記爲const,rvalue引用就可以被傳遞。謝謝! – user1034081 2012-03-06 13:44:47