C++ std :: copy结果与字符串构造函数不同

Jak*_*ůza 3 c++

我在使用std :: copy时遇到了一些奇怪的行为.同

std::vector<std::string> chosenIDs{...};
for (const auto& x : chosenIDs) {
  std::string strID("");
  std::copy(std::begin(x), std::find(std::begin(x), std::end(x), '.'), std::begin(strID));
  std::cout << strID << "\n";
}
Run Code Online (Sandbox Code Playgroud)

但是,strID字符串包含它不应该使用的字符

std::vector<std::string> chosenIDs{...};
for (const auto& x : chosenIDs) {
  std::string strID(std::begin(x), std::find(std::begin(x), std::end(x), '.'));     
  std::cout << strID << "\n";
}
Run Code Online (Sandbox Code Playgroud)

工作得很好.我很清楚我应该使用第二种方法,但它仍然让我感到困惑的是为什么第一个片段中的行为与第二个片段的行为不同.

我正在使用GCC 5.4.0

Die*_*ühl 5

使用std::copy()时,必须确保两个范围都不会超出边界访问.目标范围从空开始,没有任何东西可以扩展它.因此,结果是未定义的行为.

问题可以修复,例如,通过使用目标迭代器增长目标序列:

std::copy(std::begin(x), std::end(x),
            std::back_inserter(strID));
Run Code Online (Sandbox Code Playgroud)