从不同类型的容器的迭代器初始化向量

Initializing a vector from iterators of a container of a different type

本文关键字:迭代器 初始化 向量 同类型      更新时间:2023-10-16

给出以下代码:

#include <iterator>
#include <vector>
int main()
{
char arr[3] = { 1,2,3 };
std::vector<char> vec = { 1,2,3 };
std::vector<int> vec_one(std::begin(arr), std::end(arr));
std::vector<int> vec_two(vec.begin(), vec.end());
}

vec_onevec_two的初始化是未定义的,是已定义还是根据常规类型转换规则定义的实现?
如果交换charint类型怎么办?

它们都很好,受将char转换为int时适用的相同规则的约束(因此无需担心)和intchar,这将再次受正常规则的约束: 如果signedcharint必须足够小以适合char(否则行为未定义), 以及定义明确的环绕行为(如果charunsigned)。

除了一种情况外,这都是定义良好的代码。int需要至少具有与char相同的大小,并且至少能够存储 16 位二进制补充整数可以存储的内容。 因此,当sizeof(char) < sizeof(int)行为被很好地定义为您可以存储charint可以存储的每个值。 如果sizeof(char) ==sizeof(int)andcharis an alias tounsigned charthen you could overflow theint',这是未定义的行为。

相反的情况也有未定义的行为。 如果charsigned charsizeof(int) > sizeof(char)的别名,则可以溢出将int转换为有符号整数溢出且未定义行为的char。 如果char是要unsigned char的别名,尽管它永远不会是未定义的行为。