以下的区别?哪一个有未定义的行为?既?
std::copy_n(asdf.begin(), asdf.size(), asdf.begin());
std::copy(asdf.begin(), asdf.end(), asdf.begin());
假设给函数std::vector<int>
。而且这两个功能并不像有些人所说的那样。
这是标准中的缺陷吗?
答案 0 :(得分:5)
std::copy_n(asdf.begin(), asdf.size(), asdf.begin());
这不是未定义的行为。 copy_n
仅要求[first, first + n)
和[result, result + n)
为有效范围。通过你已经通过的论据,你已经保证了它们。 (我假设asdf
是一个标准容器,或者是一个具有类似行为的容器。我还假设所包含的类型具有表现良好的赋值运算符)
std::copy(asdf.begin(), asdf.end(), asdf.begin());
这有未定义的行为。对于std::copy
,result
不得在[first, last)