STL 算法 return 类型转换而不会丢失数据

STL algorithms return type cast without possible data loss

我正在尝试创建一个模板函数,该函数 returns STL 算法函数的结果,没有任何“可能的数据丢失”警告。

template<typename T>
T sum(vector<T> A) {
     return accumulate(A.begin(), A.end(), 0);
}

int main() {
    vector<float> A;
    sum(A);

    return 0;
}

但这给了我: 警告 C4244 'return':从“_Ty”转换为 'T',可能会丢失数据 警告 C4244“=”:从 'float' 转换为“_Ty”,可能丢失数据

我也尝试了静态转换,但我仍然收到第二个警告('float' 到“_Ty”)。

 template<typename T>
 T sum(vector<T> A) {
      return static_cast<T>(accumulate(A.begin(), A.end(), 0));
 }

有没有办法消除此类警告?

您有一个浮点向量,因此所需的 return 类型的 accumulate 也应该是 float。现在是 int,因为这种类型是根据 accumulate 的第三个传递参数推导出来的 - 0 数字文字的类型是 int.

要解决此问题,您应该将向量的 value_type 作为 float 传递,并通过 T{}:

默认初始化(为零)
accumulate(A.begin(), A.end(), T{});