提供以下代码:
#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_one
和vec_two
的初始化是否未定义,实现是否根据普通类型转换规则定义或定义?
如果交换char
和int
类型怎么办?
答案 0 :(得分:5)
它们都很好,在将char
转换为int
(因此没有问题)和int
转换为char
时应遵循相同的规则再次受到正常规则的约束:如果int
为char
,则char
必须足够小以适合signed
(否则行为未定义),以及char
为unsigned
时明确定义的环绕行为。
答案 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`,这是未定义的行为。
相反的情况也有未定义的行为。如果char
是signed char
和sizeof(int) > sizeof(char)
的别名,那么您可能会溢出将int
转换为带有符号整数溢出的char
并且是未定义的行为。如果char
是unsigned char
的别名,但它永远不会是未定义的行为。