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

时间:2017-06-28 12:09:18

标签: c++ vector iterator language-lawyer

提供以下代码:

#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类型怎么办?

2 个答案:

答案 0 :(得分:5)

它们都很好,在将char转换为int(因此没有问题)和int转换为char时应遵循相同的规则再次受到正常规则的约束:如果intchar,则char必须足够小以适合signed(否则行为未定义),以及charunsigned时明确定义的环绕行为。

答案 1 :(得分:4)

除了一种情况外,这是完全定义的代码。 int必须至少与char具有相同的大小,并且至少能够存储16位二进制补码整数可以存储的内容。因此,sizeof(char) < sizeof(int)行为定义得很明确,因为int可以存储每个值char。如果sizeof(char) == sizeof(int)and char is an alias to unsigned char then you could overflow the int`,这是未定义的行为。

相反的情况也有未定义的行为。如果charsigned charsizeof(int) > sizeof(char)的别名,那么您可能会溢出将int转换为带有符号整数溢出的char并且是未定义的行为。如果charunsigned char的别名,但它永远不会是未定义的行为。