You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++创建constexpr模板容器求和函数遇问题求助

问题分析与解决

编译错误原因

原代码中decltype(*arr.begin())返回的是容器元素的左值引用类型(传入const容器时为const左值引用),导致arrType res = 0;将res声明为const引用,后续循环中res += *it尝试修改只读引用,触发编译错误。

修正后的完整代码

#include <iostream>
#include <array>
#include <vector>
#include <type_traits>

template <typename T>
constexpr auto Sum(const T& arr)
{
    // 移除引用属性,获取元素的实际值类型
    using arrType = std::remove_reference_t<decltype(*arr.begin())>;
    arrType res{}; // 值初始化,适配更多数值类型
    for (const auto& elem : arr) {
        res += elem;
    }
    return res;
}

int main()
{
    constexpr std::array<int, 3> base{5, 2, 0};
    static_assert(Sum(base) == 7, "数组求和结果应为7");
    
    // 运行时验证其他容器
    const std::vector<double> vec{1.5, 2.5, 3.0};
    std::cout << Sum(vec) << std::endl; // 输出7.0

    return 0;
}

关键修正说明

  • 用std::remove_reference_t剥离元素类型的引用属性,确保res是可修改的值类型,解决只读引用的编译错误。
  • 改用范围for循环,简化代码逻辑,避免迭代器操作冗余。
  • 用res{}值初始化替代res = 0,对无符号整数、浮点数等类型更友好。

版本兼容说明

上述代码需要C17及以上标准编译,因为C17才允许在constexpr函数中使用普通for循环。如果需兼容C++14,可改用递归实现:

// C++14兼容的递归版constexpr求和
template <typename T, size_t N>
constexpr auto Sum(const std::array<T, N>& arr, size_t idx = 0)
{
    return idx == N ? T{} : arr[idx] + Sum(arr, idx + 1);
}

内容的提问来源于stack exchange,提问作者莫里Mori

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 02:15:34