【发布时间】:2016-02-27 17:02:45
【问题描述】:
我在编码练习中使用 std::accumulate 并遇到了一些我想更全面了解的行为。
累加的签名是:
T accumulate( InputIt first, InputIt last, T init );
如果我有这样的代码:
std::vector<int> a = {..};
int64_t zero = 0;
int64_t csum = std::accumulate(a.begin(), a.end(), zero);
它按我的预期工作。如果我将其更改为:
std::vector<int> a = {..};
int64_t csum = std::accumulate(a.begin(), a.end(), 0);
然后我得到溢出,因为(我认为)“0”的类型被确定为 32 位整数,这会覆盖我实际指定的返回类型(因为普通整数可以存储在 64 位整数中)。
由此我推断编译器正在生成一个累加,如下所示:
int accumulate( InputIt first, InputIt last, int init );
对比
int64_t accumulate( InputIt first, InputIt last, int64_t);
我记得有什么规则可以将此推论推广到其他情况吗?
【问题讨论】:
-
你是故意混合类型吗?
-
是的,我得到一个整数向量并且需要求和,因此溢出是一个问题。
-
我知道向量中的 'int' 是 32 位签名的。