编译时检查所有数组值是否已填充

Compile-time check that all array values are filled

这个:

constexpr const std::array<int, 3> {{
  0,
  1
}};

编译成功。

但是如何检查(在编译时)整个数组是否已填满?可能是一些 static_assert?

您可以编写一个包装器来为您生成数组并执行检查:

template <typename T, std::size_t N, typename... Ts>
std::array<T, N> make_array (Ts&&... ts) {
    static_assert(N == sizeof...(Ts), "Must supply N arguments");
    return {{ std::forward<Ts>(ts)... }};   
}

但是使用该函数,您也可以从参数中推断出数组的大小:

template <typename T, typename... Ts>
std::array<T, sizeof...(Ts)> make_array (Ts&&... ts) {
    return {{ std::forward<Ts>(ts)... }};   
}

作为对 TartanLlama 答案的增强,我会将初始化例程包装到另一个宏中,以提供创建适当文档和更好可读性的可能性(因为操作提到这是对其他程序员的安全检查)。

template <typename T, T ...ts>
struct ArrayInitializer { 
    const std::array<T, sizeof...(ts)> ARRAY = {{ ts... }}; 
};

/*
 * @document me
 */
#define MAKE_ARRAY(name, ...) \
    constexpr const auto name = ArrayInitializer<int,  ##__VA_ARGS__ >().ARRAY;

// Create array with x elements    
MAKE_ARRAY(arrayName, 1, 2, 3, 4);