![](/img/trans.png)
[英]Loading OpenGL texture with SOIL in std::thread raises “Integer Division by Zero”
[英]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.