在下面的代码中,“情况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] 删除。
我来说两句