c++ - MSVC 中 std::string::operator[] 的奇怪行为

标签 c++ visual-studio-2010

我一直在使用一些半迭代器来标记一个 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/

相关文章:

c++ - "Missing type specifier int assumed"C++ 问题

visual-studio-2010 - Visual Studio 2010中的空白可见性切换在哪里?

visual-studio-2010 - 使用 Visual Studio 2010 为 Windows Phone 开发?

c++ - x64 系统上的 win32 应用程序运行时错误(dll 加载),同时编译 0K

c# - 在 Visual Studio 2015 中调试 native 应用程序加载的托管 DLL

c++ - 使用 auto 对仿函数进行类型推导

vb.net - 如何使自定义ComboBox(OwnerDrawFixed)看起来像标准ComboBox的3D?

c - "char"类型的参数与 char* 类型的参数不兼容

c# - 在 Windows8 中编写 C#/XAML 与 C++/XAML WinRT 应用程序的优缺点是什么?

C++文件输出只接受第一个字