我一直在使用一些半迭代器来标记一个 std::string,并且我遇到了一个关于 operator[] 的奇怪问题。当使用 char* 从一个位置构造一个新字符串时,我使用了如下内容:
t.begin = i;
t.end = i + 1;
t.contents = std::string(&arg.second[t.begin], &arg.second[t.end]);
其中 arg.second 是一个 std::string。但是,如果 i 是最后一个字符的位置,那么 arg.second[t.end]
将抛出一个调试断言——即使采用一个指针指向最后一个是明确定义的行为甚至是基本数组的常见行为,并且由于使用迭代器调用构造函数,我知道最终迭代器永远不会被取消引用。 arg.second[arg.second.size()]
应该是一个有效的表达式,生成等同于 arg.second.end()
的表达式,这看起来不符合逻辑吗?作为 char*?
最佳答案
您不是在将指针指向末尾,而是在末尾访问一个,然后获取它的地址。完全不同,虽然前者定义明确且结构良好,但后者两者都不是。我建议使用迭代器构造函数,这基本上就是您正在使用的,但使用迭代器而不是 char* 来实现。请参阅亚历山大的评论。
关于c++ - MSVC 中 std::string::operator[] 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4441879/