所以我寫了一個函數,它應該像一個一樣,返回一個數組(因爲你知道數組不允許用C++返回),爲此我需要一個臨時未命名的參數,它將被用作默認參數值最後一個參數含蓄,像這樣:C++如何聲明一個臨時未命名的,未初始化的數組?
template<size_t szArr, typename typeArrs>
auto fnAdd2ArrayElements(const typeArrs (&arr_0)[szArr], const typeArrs (&arr_1)[szArr], typeArrs (&&result)[szArr] = {}) -> typeArrs (&&)[szArr]
{
for(size_t i(0); i < szArr; ++i)
result[i] = arr_0[i] + arr_1[i];
return move(result);
}
正如你所看到的「結果」參數有一個默認的參數值未命名的數組,但將永遠「零填充」,因爲空方括號。這會降低性能,因爲你可以看到我的功能並不關心它的內容,並將填補所有內容。無論如何,我可以宣佈它未初始化。類似這樣的:
template<typename T, size_t sz> using identity = T [sz];
template<size_t szArr, typename typeArrs>
auto fnAdd2ArrayElements(const typeArrs (&arr_0)[szArr], const typeArrs (&arr_1)[szArr], typeArrs (&&result)[szArr] = identity<typeArrs, szArr>()) -> typeArrs (&&)[szArr]
{
for(size_t i(0); i < szArr; ++i)
result[i] = arr_0[i] + arr_1[i];
return move(result);
}
但是上面的代碼不會編譯。那麼,有什麼想法可以做到這一點?
編輯:看來還有其他問題出現。由於我們返回一個'xvalue'(而不是'prvalue'),如果我們將結果存儲在'rvalue'引用中,那麼未命名的臨時對象的生命期將不會延長,就好像我們已經按值返回了一個數組。這裏是一個例子:
const int iArr[] = {0, 1, 2, 3, 4};
const int iArr1[] = {0, 1, 2, 3, 4};
int (&&added)[5] = fnAdd2ArrayElements(iArr, iArr1); //this will create an dangling reference
added[0]; //illegal - accessing dangling reference
爲什麼你(想你)必須返回一個數組?你打算如何使用它? [爲什麼不使用向量?] – 2014-11-24 08:38:51
你有沒有考慮過'std :: array'? – Jarod42 2014-11-24 08:39:38
是的,但我想直接使用內置陣列。 – AnArrayOfFunctions 2014-11-24 08:47:46