繁体   English   中英

std:: 累加除以零

[英]std:: accumulate division by zero

我不明白为什么我在下面的代码中被零除。

template <typename T>
typename std::iterator_traits<T>::value_type avg_abs_difference(T first, T second)
{
    using Type = typename std::iterator_traits<T>::value_type;
    if(first == second)return 0;
    Type oldValue = *first;
    Type count = 0;
    Type res = std::accumulate(std::next(first), second, 0, [&](Type a, Type b)
                           {
                            Type result = a + std::abs(b- oldValue);
                            oldValue = b;
                            ++count;
                            return  result; }
                            )/ count;
    return res ;
}

但是当我像这样向外拉分裂时,它不会发生。

template <typename T>
typename std::iterator_traits<T>::value_type avg_abs_difference(T first, T second)
{
    using Type = typename std::iterator_traits<T>::value_type;
    if(first == second)return 0;
    Type oldValue = *first;
    Type count = 0;
    Type res = std::accumulate(std::next(first), second, 0, [&](Type a, Type b)
                           {
                            Type result = a + std::abs(b- oldValue);
                            oldValue = b;
                            ++count;
                            return  result; }
                            );
    return res / count;
}

那是因为 "count" 在 std::accumulate 之前被评估,所以没有考虑副作用。

https://en.cppreference.com/w/cpp/language/eval_order

未指定任何表达式的任何部分的评估顺序,包括 function arguments 的评估顺序(下面列出了一些例外情况)。 编译器可以按任何顺序计算操作数和其他子表达式,并且可以在再次计算同一表达式时选择另一个顺序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM