2

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

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

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

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

然后从 main 打印 spanOut 的内容:

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

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

4

2 回答 2

1

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

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

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

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

于 2019-09-29T10:49:06.167 回答
0

事实证明Anonymous Anonymous正确的,导师希望我使用动态分配的内存。为了我自己的利益,我已经变得太“聪明”了,而忽略了明显的东西而倾向于复杂性。谢谢你,LF,你出色的跨度细分:)

于 2019-10-03T02:51:31.100 回答