C++ 如何從函數中返回數組的引用並且該數組包含 10 個 string 對象?

《C++ Primer(第5版)》練習 6.36:編寫一個函數的聲明,使其返回數組的引用並且該數組包含 10 個 string 對象。不要使用尾置返回類型、decltype 或者類型別名。

函數聲明已經能寫出來了,如題目中的所示:

string ( f(void))[10];

現在如何實現這個函數原型,讓它能在函數體內構造出符合函數聲明中返回類型的對象,並用 return 返回呢?用 new 怎麼都實現不了,不知道怎麼轉換:

string ( f(void))[10]
{
string * str = new string[10];
// 到這裡就不知道該怎麼轉換了
}


std::string ( f(void))[10]
{
std::string* str = new std::string[10];
std::string strRef = *str;
std::string (strARef)[10] = reinterpret_cast&(strRef);
return strARef;
}

(直接用 deref 就行,編譯器見到 lvalue 會把 deref 取消直接傳地址。) 發現要實現原來的語意還是得用上 reinterpret_cast.


string (f(void))[10]
{
static string fuck[10];
return fuck;
}


std::string(f(string(s)[10]))[10]
{
return s;
}

//講道理嘛,只有這樣才是正確的。雖然static和reinterpret_cast都能解決問題,但是不能正確地回收內存,所以大家都指出了這個樣子不建議使用。最好還是使用真正能把對象留在棧上的機制。所以……

//題目里又沒寫這個函數有什麼參數,對吧。當然,如果你實際上真的要用這樣的函數,可以用std::swap把真正要返回的對象放進去或者用右值。


不建議返回指向函數內部new的變數的指針和引用。請看effective C++


我只想說一句永遠不要寫這樣的代碼


using arrT = const string ()[10];
string str[10] = { "1","2","3","4","5","6","7","8","9","0" };
const string ( return_arr(const string (s)[10]))[10]
{
return s;
}
arrT return_arr(const string(s)[10])
{
return s;
}
auto return_arr(const string(s)[10]) -&> const string ()[10]
{
return s;
}
const decltype(str) return_arr(const string(s)[10])
{
return s;
}

剛好看到這裡,書上的思路應該就是這幾種了。


一定要返回引用么?

指針不要嗎?

那就返回全局變數或static變數吧


推薦閱讀:

TAG:編程語言 | C | string |