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&
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;
}
//題目里又沒寫這個函數有什麼參數,對吧。當然,如果你實際上真的要用這樣的函數,可以用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變數吧推薦閱讀: