C ++ std :: string初始化的行为不正确

时间:2016-05-15 02:36:14

标签: c++ string stl

为什么以下代码会编译?它使用clang和print Notice: undefined offset编译并运行良好但是,我认为正确的行为应该是抱怨并发出正确的错误。

list($cc, $pc, $pn, $an1, $ac1, $an2, $ac2, $lat, $lon) = explode(" ", $row);

这个问题的灵感来自this

2 个答案:

答案 0 :(得分:9)

std::string有一个模板构造函数,它接受两个迭代器。当你传递字符串文字时,它们会衰减到char const*,它有资格作为迭代器。但是,由于这些指针不能形成有效范围,因此您有未定义的行为。

答案 1 :(得分:4)

这是未定义的行为。

这是调用std::string的构造函数,它接受两个迭代器,即开始和结束迭代器值。因为两个初始化参数具有相同的类型,所以它们被解释为一对迭代器,并匹配这个特定的重载构造函数。

字符指针的值被解释为开始/结束迭代器值。它恰好与clang一起使用,但是使用gcc会引发异常。