這裏是我的代碼:如何返回參考的unique_ptr含nullptr
typedef map<string, unique_ptr<MyClass> > DB;
const unique_ptr<MyClass>>& find_it(const string &key, const DB &db)
{
auto itr = db.find(key);
if (itr == db.end()) {
return nullptr;
}
return itr->second;
}
返回語句使編譯器警告:returning reference to local temporary object [-Wreturn-stack-address].
是的,我可以理解,返回到本地臨時變量的引用是壞了,但我不知道什麼是簡單的解決辦法這裏給出如下:
1. Do not expose the map to the callers of find_it (I use typedef here is just for asking this question, in real code it is wrapped inside an interface).
2. Using an iterator kind of thing to indicate the position of the searched item is a hassle to me, I like to avoid it.
鑑於這些,我可以拿出最好的是打破find_it()2復
bool exists(const string &key, const DB &db)
{
auto itr = db.find(key);
return itr != db.end();
}
const unique_ptr<MyClass>>& find_it(const string &key, const DB &db)
{
auto itr = db.find(key);
assert(itr != db.end());
return itr->second;
}
有什麼建議嗎?
您不能返回參考'nullptr'你不能在'INT&'參考返回'0'相同的方式。此外,我不明白如何返回迭代器是一件麻煩 - 無論如何你必須解除指針的引用。什麼你應該使用,而不是將返回'提振::可選'(或使用其他'optional'類,也許有自己寫的),如果用戶不應該關心'unique_ptr's(和案件的99%,他不應該 - 它是一個實現細節)。 –
milleniumbug
2014-08-28 16:50:27
返回對'unique_ptr'的引用可能被認爲是誤導性的。我認爲返回一個原始指針,或者'shared_ptr'會更好。但是返回一個迭代器對象會比兩者都好。 – 2014-08-28 16:51:32
爲什麼不採取參數迭代器,返回一個迭代器上失敗成功,'db.end()'的位置? – 0x499602D2 2014-08-28 18:15:07