gpt4 book ai didi

c++ - 为什么当将迭代器作为参数传递并在尾部位置递归时,后缀失败而前缀工作正常?

转载 作者:太空狗 更新时间:2023-10-29 23:43:35 25 4
gpt4 key购买 nike

<分区>

我无意中遇到了这个问题。

本来以为google肯定能解决的,但是搜索了多个关键词还是找不到答案,这让我很困惑。

当我在尾部位置使用前缀时,代码工作正常:

template<class ContinerIterator, class F>
constexpr auto fun(ContinerIterator IteratorBegin, ContinerIterator IteratorEnd, F f)
{
switch (IteratorBegin == IteratorEnd)
{
case true: return;
case false: f(*IteratorBegin);
}
return fun(++IteratorBegin, IteratorEnd, f);
}
int main()
{
std::vector<int> a = { 1, 2, 3, 4 };
fun(std::begin(a), std::end(a), [](auto &a)->auto{a *= 2; });
for (auto v : a)
{
std::cout << v << std::endl;
}
return 0;
}

1

2

3

4

Press any key to continue . . .


但是,如果我使用 postfix,IteratorBegin 神经到达 iteratorEnd 并且走得很远,所以 segmentfault。

template<class ContinerIterator, class F>
constexpr auto fun(ContinerIterator IteratorBegin, ContinerIterator IteratorEnd, F f)
{
switch (IteratorBegin == IteratorEnd)
{
case true: return;
case false: f(*IteratorBegin);
}
return fun(IteratorBegin++, IteratorEnd, f);
}
void test()
{

}
int main()
{
std::vector<int> a = { 1, 2, 3, 4 };
fun(std::begin(a), std::end(a), [](auto &a)->auto{a *= 2; });
for (auto v : a)
{
std::cout << v << std::endl;
}
return 0;
}

我试过 MSVC、G++、Clang,都失败了。这是 gcc 的错误列表:

Segmentation fault (core dumped)

这是 Clang 的:

Error occurred (timeout). Try again later.

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