gpt4 book ai didi

C++如何声明一个临时的未命名、未初始化的数组?

转载 作者:行者123 更新时间:2023-11-30 02:42:25 25 4
gpt4 key购买 nike

所以我写了一个函数,它应该像一个函数一样,返回一个数组(正如你所知,在 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

最佳答案

因为这个临时文件的生命周期,所以会有风险:

template <typename T, size_t N>
struct UninitializedArray
{
UninitializedArray() {}
T arr[N];
};

template <size_t szArr, typename typeArrs>
typeArrs (&&)[szArr]
fnAdd2ArrayElements(
const typeArrs (&arr_0)[szArr],
const typeArrs (&arr_1)[szArr],
typeArrs (&&result)[szArr] = UninitializedArray<typeArrs, szArr>{}.arr)
{
std::cout << result[0] << std::endl; // To check that value is not initialized.

for (size_t i(0); i < szArr; ++i) {
result[i] = arr_0[i] + arr_1[i];
}
return std::move(result);
}

Live example

关于C++如何声明一个临时的未命名、未初始化的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27100629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com