我可以在C++中返回跨度吗?如果是这样,如何?(对替代方案开放

Can I return a span in C++? If so, how? (Open to alternatives.)

本文关键字:如何 方案 返回 C++ 我可以 如果      更新时间:2023-10-16

我得到的任务的项目指南特别禁止使用向量和字符串,但我需要从函数中传递一个大小不确定的字符数组。如果我能更好地理解它的使用方式,那么使用span似乎可以用于此目的。如果有人可以推荐一种更好/不同的传递数组的方法(除了字符串和向量(,我很想了解它。

我已经考虑过生成一个暂存文件并将输入文本存储在那里以供程序其他地方调用,但这似乎比在这种情况下应该需要的更麻烦。这个程序也足够小,我可以做所有事情,但这也不应该是必需的。

我想做的是能够调用这样的函数:

span<char> getSpan(){
char arr[] = { 'A', 'B', 'C' };
span<char> spanOut{ arr };
return spanOut;
}

然后从主打印 spanOut 的内容:

int main() {
// Some Code...
printSpan = getSpan();
std::cout << printSpan;
}

理想情况下,上述代码的结果是将ABC打印到终端。

span是一个非拥有视图。 它类似于指针和引用。 当getSpan返回时,本地数组arr不再存在。 返回的 span 指向这个不存在的数组,访问它会导致未定义的行为。 这类似于悬空指针问题。

如果确保在函数返回后存储仍然存在,则可以返回span

auto getSpan()
{
static char arr[] = { 'A', 'B', 'C' }; // note: static
return span(arr);
}

请注意,只要您返回具有指针语义(即非拥有(的内容(迭代器、引用等(,就会出现此问题。

事实证明,匿名匿名是正确的,讲师希望我使用动态分配的内存。为了我自己的利益,我变得太"聪明"了,错过了显而易见的东西,而倾向于复杂性。谢谢你,L.F.,你对跨度:)的出色细分