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
相关产品推荐
相关产品推荐

