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

C++17下如何实现编译期判断constexpr std::array所有元素相等

问题原因

if constexpr 的判断条件必须是编译期可确定的常量表达式。你代码里的循环变量i是普通的运行时变量,哪怕整个lambda是在constexpr上下文执行,i的取值在语法层面不属于编译期常量,因此a[i]无法作为常量参与if constexpr的条件判断,这就是编译报错的核心原因。

C++17 可行实现方案

可以借助std::index_sequence将数组索引转换为编译期模板参数,配合C17支持的折叠表达式实现编译期判断,完全不需要依赖C20才constexpr化的<algorithm>算法,兼容CUDA对C++版本的限制:

#include <array>
#include <utility>

template<typename T, size_t N, size_t... Is>
constexpr bool all_equal_impl(const std::array<T, N>& arr, std::index_sequence<Is...>) {
    // 折叠表达式判断所有元素都等于arr[0]
    return ((arr[0] == arr[Is + 1]) && ...);
}

template<typename T, size_t N>
constexpr bool all_equal(const std::array<T, N>& arr) {
    // 长度小于等于1的数组默认所有元素相等
    if constexpr (N <= 1) return true;
    // 生成从0到N-2的索引序列,对应遍历第1到第N-1个元素
    else return all_equal_impl(arr, std::make_index_sequence<N - 1>{});
}

int main()
{
    constexpr std::array<int, 3> a {0, 0, 0};
    constexpr bool equal = all_equal(a); // 编译期完成计算,值为true
}

内容的提问来源于stack exchange,提问作者Olaf Willocx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:15:04