C++17标准Clang环境下数组全元素初始化为整数1的实现咨询
适配Clang C++17的数组全元素初始化为1的实现方案
下面所有方案均无编译器扩展依赖(除特殊说明外),完全兼容Clang编译器,执行std::cout<<a[5];可输出1。
方法1:通用运行期初始化(写法最简单,兼容性最高)
适配普通栈数组、std::array、动态数组所有场景,是最稳妥的实现方式:
#include <iostream> #include <algorithm> // std::fill 所需头文件 int main() { // 示例1:普通栈数组 int a[10]; std::fill(std::begin(a), std::end(a), 1); // 示例2:std::array 写法完全一致 // std::array<int, 10> a; // std::fill(a.begin(), a.end(), 1); // 示例3:动态数组 // int* a = new int[10]; // std::fill(a, a + 10, 1); std::cout << a[5]; return 0; }
优点:完全符合C++标准,无平台差异,可适配任意长度的数组,Clang全版本支持
方法2:编译期初始化(无运行时开销,适合静态数组)
如果数组长度在编译期即可确定,可以用C++17折叠表达式实现编译期全量初始化,运行时无额外性能消耗:
#include <iostream> #include <array> #include <utility> template <size_t N, typename T> constexpr std::array<T, N> make_filled_array(const T& val) { return [&]<size_t... Is>(std::index_sequence<Is...>) { return std::array{(Is, val)...}; }(std::make_index_sequence<N>{}); } int main() { constexpr auto a = make_filled_array<10, int>(1); std::cout << a[5]; return 0; }
优点:初始化逻辑完全在编译期执行,性能最优,Clang 5及以上版本完全支持
方法3:极简栈数组初始化(Clang扩展支持,写法最简洁)
如果不需要严格遵循纯C++标准,可以用Clang原生支持的范围初始化语法,代码最短:
int a[10] = {[0 ... 9] = 1};
注意:该语法是C11标准扩展,Clang对其支持非常稳定,适合非严格标准要求的工程使用
内容的提问来源于stack exchange,提问作者Hmm
相关产品推荐
相关产品推荐

