对默认构造的std::span使用范围for循环是否属于未定义行为?
对默认构造的std::span使用范围for循环是否属于定义行为?
我想知道对默认构造的std::span使用范围for循环是否属于定义行为,我会在循环前有条件地为默认构造的std::span赋值。比如,我能否编写如下代码?
#include <span> int main() { std::span<char> s; for (auto c : s) { // do something } // should be equivalent to for (char* p = nullptr; p < (char*)(nullptr) + 0; ++p) { // do something } }
关于指针加法表达式有如下规则说明:
如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素之后的位置,那么求值不得产生溢出;否则,行为未定义。
严格来说,对(char*)(nullptr)执行加0操作属于未定义行为,因为该操作数并未指向同一数组对象中的元素。但我想知道这种情况是否仍属于定义行为?
我认为它是定义良好的,因为以下代码无法编译:
int main() { constexpr char* a{nullptr}; constexpr char* b{a+1}; return 0; }
但如果将a+1替换为a+0,代码就能编译。因此必然存在允许对nullptr加0的特殊规则。
内容的提问来源于stack exchange,提问作者phinz
相关产品推荐
相关产品推荐

