使用 std::begin 和 std::end 进行矢量初始化

Vector initialization with std::begin and std::end

为什么可行?有两个不同的字符串 "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;
}

您很幸运,编译器执行了 string pooling 优化。请注意,您所做的仍然是未定义的行为,并且使用不同的编译器或不同的编译器设置,您将不会那么幸运。不要再这样做了。

这两个相同的文字字符串很可能在内存中合并为一个字符串,因此开始和结束引用同一个字符串。

虽然这仅适用于 'accident' 在您的程序中...

这个有点相关How Do C++ Compilers Merge Identical String Literals

由于允许编译器将在不同位置使用的相同字符串文字存储在一个地方,因此 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, " "));

There are two different strings "testString"

它们与您的情况相同。允许编译器为相等或重叠 string literals 组合存储。

The compiler is allowed, but not required, to combine storage for equal or overlapping string literals. That means that identical string literals may or may not compare equal when compared by pointer.

您可以通过

查看
std::cout << std::boolalpha << ("testString"=="testString");

LIVE

无论如何,你不应该依赖它,不能保证行为。