从 constexpr 数组获取 constexpr 属性 有困难

Difficulties getting a constexpr property from a constexpr array

我遇到了这个问题,我似乎无法在编译时检查 std::array 中的所有元素是否相等。它看起来很简单,无论如何我都不是 C++ 的新手,但我想不通! (我只想使用 <algorithm> 但遗憾的是,这些在 C++17 中没有标记为 constexpr,而且我坚持使用 C++17 因为 CUDA。)

这是一个示例(无法编译)。

#include <array>

int main()
{
    constexpr std::array<int, 3> a {0, 0, 0};

    constexpr bool equal = [=](){
        for (int i = 1; i < 3; i++)
        {   
            if constexpr (a[0] != a[i])
                return false;
        }
        return true;
    }();
}

为什么 a[0] != a[i] 不符合 constexpr 的条件? (这是 GCC 和 Clang 给我的错误。)我如何得到我需要的结果?

由于您的 i 不是编译时常量,因此您不能使用 if constexpr。一个简单的 if 就足够了,它仍然可以在编译时检查你的数组。

#include <array>

int main()
{
    constexpr std::array<int, 3> a {0, 0, 0};

    constexpr bool equal = [=](){
        for (int i = 1; i < 3; i++)
        {   
            if (a[0] != a[i])
          //^^
                return false;
        }
        return true;
    }();
}