Итак, я писал функцию, которая должна действовать как одна, возвращая массив (поскольку вы знаете, что массивы не могут быть возвращены на 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
Почему вы (думаю, вам) нужно возвращать массив? Как вы планируете использовать это? [И почему вы не используете вектор?] –
Вы считали 'std :: array'? – Jarod42
Да, но я хочу напрямую использовать встроенные массивы. – AnArrayOfFunctions