复制和修改std :: strings时出现无法解释的差异

雅各比·约翰(Jacobi John)

在下面的代码中,“情况1”在所有测试的编译器上均按预期工作,但是“情况2”在所使用的编译器的作用下似乎有所不同。

例如,MSVC的sit1和sit2产生相同的结果,但是当使用gcc / clang和libstdc ++时,即使我使用C +进行构建,修改也会发生在原始字符串上,并且它是复制的(有点像COW字符串) +11开关。

#include <iostream>
#include <string>

int main() {

   // situation 1
   {
      std::string x0 = "12345678";
      std::string x1 = x0;

      char* ptr = &x0[0] + 3;

      (*ptr) = ' ';

      std::cout << "1. x0: " << x0 << "\n";
      std::cout << "1. x1: " << x1 << "\n";

      if ((&x0[0]) == x0.data()) std::cout << "1. ptrs are equal\n";

   }

   // situation 2
   {
      std::string x0 = "12345678";
      std::string x1 = x0;

      char* ptr = const_cast<char*>(x0.data() + 3);

      (*ptr) = ' ';

      std::cout << "2. x0: " << x0 << "\n";
      std::cout << "2. x1: " << x1 << "\n";

      if ((&x0[0]) == x0.data()) std::cout << "2. ptrs are equal\n";
   }

   return 0;
}

海湾合作委员会(6.1)

1. x0: 123 5678
1. x1: 12345678
1. ptrs are equal
2. x0: 123 5678
2. x1: 123 5678
2. ptrs are equal

MSVC(2015年)

1. x0: 123 5678
1. x1: 12345678
1. ptrs are equal
2. x0: 123 5678
2. x1: 12345678
2. ptrs are equal

考虑到&x0 [0]和.data()返回相同的地址,各种编译器之间的行为差​​异是否有任何原因?

毫米

情况2导致不确定的行为:

char* ptr = const_cast<char*>(x0.data() + 3);

(*ptr) = 'Z';

根据std::basic_string::data(C ++ 14 [string.accessors] / 3)的规范

要求:程序不得更改存储在字符数组中的任何值。

换句话说,您不允许const通过data()返回的指针来抛弃和修改字符串c_str()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python日期时间无法解释的秒和微秒之间的差异

来自分类Dev

无法解释打包和未打包小部件时行为的差异

来自分类Dev

我无法解释的列表附加和+运算符之间的时间差异

来自分类Dev

position和float导致CSS下拉菜单中出现无法解释的行为

来自分类Dev

位置和浮动会导致CSS下拉菜单中出现无法解释的行为

来自分类Dev

本机库加载时出现无法解释的UnsatisfiedLinkError

来自分类Dev

本机库加载时出现无法解释的UnsatisfiedLinkError

来自分类Dev

运行存储过程时出现无法解释的超时

来自分类Dev

使用PySimpleGui时出现无法解释的持续错误

来自分类Dev

调用构造函数时出现无法解释的“ CallFailed”异常

来自分类Dev

nodejs分析未知和无法解释的结果

来自分类Dev

使用名称空间时,无法在XSLT中复制和修改属性

来自分类Dev

指针数组无法解释的行为(带有浅表复制)C ++

来自分类Dev

访问文件列表时出现无法解释的Mono应用程序崩溃

来自分类Dev

在两个数组中交换值时出现无法解释的问题

来自分类Dev

R - 绘制时间序列数据时出现无法解释的尖峰

来自分类Dev

iOS 7 Simulator vs Real iPhone无法解释的差异

来自分类Dev

无法解释两个查询之间的差异

来自分类Dev

复制(和修改)对象时,如何避免Javascript中的过时吸气剂?

来自分类Dev

通过分叉创建过程和子项:无法解释的行为

来自分类Dev

使用C ++,SDL,OpenGL和GLEW的无法解释的内存错误

来自分类Dev

工具栏和LinearLayout之间的左侧无法解释的间隙/填充

来自分类Dev

尝试找出JUnit测试和模型对象无法解释的错误

来自分类Dev

具有不完整的返回类型和无法解释的模板的变通方法

来自分类Dev

Python Vigenere 工作,但我无法解释使用函数的空格和非字母字符

来自分类Dev

reduce()无法解释?

来自分类Dev

PHP应用程序出现无法解释的404错误

来自分类Dev

如果无法修改set元素,为什么std :: set提供begin()和end()

来自分类Dev

使用尾递归时无法解释的行为

Related 相关文章

  1. 1

    Python日期时间无法解释的秒和微秒之间的差异

  2. 2

    无法解释打包和未打包小部件时行为的差异

  3. 3

    我无法解释的列表附加和+运算符之间的时间差异

  4. 4

    position和float导致CSS下拉菜单中出现无法解释的行为

  5. 5

    位置和浮动会导致CSS下拉菜单中出现无法解释的行为

  6. 6

    本机库加载时出现无法解释的UnsatisfiedLinkError

  7. 7

    本机库加载时出现无法解释的UnsatisfiedLinkError

  8. 8

    运行存储过程时出现无法解释的超时

  9. 9

    使用PySimpleGui时出现无法解释的持续错误

  10. 10

    调用构造函数时出现无法解释的“ CallFailed”异常

  11. 11

    nodejs分析未知和无法解释的结果

  12. 12

    使用名称空间时,无法在XSLT中复制和修改属性

  13. 13

    指针数组无法解释的行为(带有浅表复制)C ++

  14. 14

    访问文件列表时出现无法解释的Mono应用程序崩溃

  15. 15

    在两个数组中交换值时出现无法解释的问题

  16. 16

    R - 绘制时间序列数据时出现无法解释的尖峰

  17. 17

    iOS 7 Simulator vs Real iPhone无法解释的差异

  18. 18

    无法解释两个查询之间的差异

  19. 19

    复制(和修改)对象时,如何避免Javascript中的过时吸气剂?

  20. 20

    通过分叉创建过程和子项:无法解释的行为

  21. 21

    使用C ++,SDL,OpenGL和GLEW的无法解释的内存错误

  22. 22

    工具栏和LinearLayout之间的左侧无法解释的间隙/填充

  23. 23

    尝试找出JUnit测试和模型对象无法解释的错误

  24. 24

    具有不完整的返回类型和无法解释的模板的变通方法

  25. 25

    Python Vigenere 工作,但我无法解释使用函数的空格和非字母字符

  26. 26

    reduce()无法解释?

  27. 27

    PHP应用程序出现无法解释的404错误

  28. 28

    如果无法修改set元素,为什么std :: set提供begin()和end()

  29. 29

    使用尾递归时无法解释的行为

热门标签

归档