从不同类型的容器的迭代器初始化向量
Initializing a vector from iterators of a container of a different type
给出以下代码:
#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
类型怎么办?
它们都很好,受将char
转换为int
时适用的相同规则的约束(因此无需担心)和int
char
,这将再次受正常规则的约束: 如果signed
char
,int
必须足够小以适合char
(否则行为未定义), 以及定义明确的环绕行为(如果char
unsigned
)。
除了一种情况外,这都是定义良好的代码。int
需要至少具有与char
相同的大小,并且至少能够存储 16 位二进制补充整数可以存储的内容。 因此,当sizeof(char) < sizeof(int)
行为被很好地定义为您可以存储char
int
可以存储的每个值。 如果sizeof(char) ==
sizeof(int)and
charis an alias to
unsigned charthen you could overflow the
int',这是未定义的行为。
相反的情况也有未定义的行为。 如果char
是signed char
和sizeof(int) > sizeof(char)
的别名,则可以溢出将int
转换为有符号整数溢出且未定义行为的char
。 如果char
是要unsigned char
的别名,尽管它永远不会是未定义的行为。
相关文章:
- 初始化迭代器错误 C++ 在 GCC 编译器中
- C++值初始化矢量迭代器比较
- 为什么"std::uninitialized_copy"通常取消对未初始化内存的迭代器的引用不是未定
- 无法取消引用值初始化迭代器
- 制作可用于初始化向量的迭代器
- 为什么 2 个未初始化的 std::set::迭代器相等?
- 如何使用迭代器初始化地图的键字段?
- 从不同类型的容器的迭代器初始化向量
- 无法查找值初始化的向量迭代器?
- 使用迭代器对向量的C 递归初始化产生不一致的结果
- 为链接列表构建迭代器类(错误:无匹配的构造函数以初始化)
- 初始化迭代器的最佳方法是什么?
- 向量是否知道在由一对迭代器初始化时首先保留?
- 错误:无法取消引用值初始化的矢量迭代器
- C 用迭代器初始化向量
- 模板标准::映射::迭代器实例化
- std::map 迭代器初始化在C++中为零
- 将迭代器初始化为vector中的某个位置
- 如果容器未知,如何将迭代器初始化为无效内容
- 循环内部的迭代程序初始化是否被认为是糟糕的风格,以及为什么