为什么以下代码会编译?它使用clang和print Notice: undefined offset
编译并运行良好但是,我认为正确的行为应该是抱怨并发出正确的错误。
list($cc, $pc, $pn, $an1, $ac1, $an2, $ac2, $lat, $lon) = explode(" ", $row);
这个问题的灵感来自this。
答案 0 :(得分:9)
std::string
有一个模板构造函数,它接受两个迭代器。当你传递字符串文字时,它们会衰减到char const*
,它有资格作为迭代器。但是,由于这些指针不能形成有效范围,因此您有未定义的行为。
答案 1 :(得分:4)
这是未定义的行为。
这是调用std::string
的构造函数,它接受两个迭代器,即开始和结束迭代器值。因为两个初始化参数具有相同的类型,所以它们被解释为一对迭代器,并匹配这个特定的重载构造函数。
字符指针的值被解释为开始/结束迭代器值。它恰好与clang一起使用,但是使用gcc会引发异常。