使用范围for循环遍历字符数组是否属于C++未定义行为?
关于C++数组范围for循环是否属于未定义行为的解答
这段代码完全不存在未定义行为,是符合C++标准的合法写法,具体原因如下:
- 针对数组类型,C++标准明确规定了范围for循环的处理逻辑:编译器会自动通过数组的首地址和首地址+数组长度确定迭代范围,等价于调用
std::begin和std::end。 - 对于
wchar_t my_array[] = { L'h', L'e', L'l', L'l', L'o' }这个长度为5的数组,std::begin(my_array)返回数组首元素的指针,std::end(my_array)返回指向数组末元素后一位的指针——这种尾后指针是标准允许的合法指针,只要不对它进行解引用操作就没有问题。而范围for循环只会迭代到end()之前的元素,不会触发对尾后指针的解引用,因此不存在越界风险。 - 循环中的
const auto& wch只是绑定到数组的每个现有元素,没有任何非法访问或越界操作。
实际运行这段代码会正确输出hello,行为完全符合预期,不存在未定义行为的隐患。
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

