【发布时间】:2018-08-07 16:10:53
【问题描述】:
我偶然发现了一些让我完全困惑的事情。
std::reverse() 将双向迭代器作为参数传入函数,但是当我将指针传递给函数时,它似乎工作正常并且实际上反转了字符串。
void reverseFour(char* str) {
reverse(str, str + strlen(str));
}
int main {
char *str = "hello";
str += '/0';
reverseFour(str);
}
所以,我的问题是,这怎么可能?双向迭代器不是指针,对吧?
【问题讨论】:
-
否,但指针是双向迭代器,选择迭代器接口是为了与指针语法兼容
-
牛是动物并不意味着动物是牛。
-
指针甚至是随机访问迭代器,至少当它们指向数组元素时。
-
@nwp -- 任何用作迭代器的指针都必须指向一个数组。如果没有,则不能增加或减少它。
-
显示的代码具有未定义的行为,因为
main()正在将一个指向字符串文字的指针传递给std::reverse()(以及一个非常量指针,即在 C++11 中不允许,除非您告诉编译器禁用该限制)。reverse()将尝试写入只读内存,这可能会使应用程序崩溃。要使代码有效,请改用char str[] = "hello";。