为什么可行?有两个不同的字符串"testString"
,但矢量大小分配正确。
#include <iostream>
#include <vector>
#include <iterator>
int main()
{
std::vector<char> str;
str.assign(std::begin("testString"), std::end("testString"));
copy(str.begin(), str.end(), std::ostream_iterator<char>(std::cout, " "));
std::cout<<str.size();
return 1;
}
答案 0 :(得分:9)
你很幸运,编译器执行了string pooling优化。请注意,您所做的仍然是未定义的行为,并且使用不同的编译器或不同的编译器设置,您将不会那么幸运。不要再这样做了。
答案 1 :(得分:2)
两个相同的文字字符串很可能在内存中合并为一个字符串,因此begin和end指的是相同的字符串。
这只适用于“意外事故”。在你的程序中虽然......
这是一个有点相关的How Do C++ Compilers Merge Identical String Literals
答案 2 :(得分:2)
由于允许编译器在一个地方存储在不同位置使用的相同字符串文字,因此std::begin("testString")
和std::end("testString")
实际上都指的是同一个字符串。
标准不强制要求这样做,编译器可以将这两个字符串文字存储在不同的位置,这会破坏这些代码。仅仅因为它有效并不意味着你应该这样做。我建议使用
std::vector<char> str;
const char [] chstr = "testString"
str.assign(std::begin(chstr), std::end(chstr));
或者更好
std::string str = "testString";
copy(str.begin(), str.end(), std::ostream_iterator<char>(std::cout, " "));
答案 3 :(得分:2)
有两个不同的字符串“testString”
在你的情况下它们是一样的。允许编译器将存储组合为相等或重叠string literals。
允许编译器但不是必需的,将存储组合为相等或重叠的字符串文字。这意味着当通过指针进行比较时,相同的字符串文字可能会或可能不会比较相等。
你可以查看,
std::cout << std::boolalpha << ("testString"=="testString");
无论如何,你不应该依赖它,行为是不能保证的。