<char> 使用 int 值初始化向量
Initialize vector <char> with int values
我想用此ASCII代码初始化此Char Vector:
vector <char> a = { 201, 187, 200, 188, 205, 186 };
我在所有6个字符中都会获得此语法错误:
从" int"到" char"的缩小转换无效:恒定值不适合目标类型
但是,当我初始化一个Char变量时,具有相同的ASCII代码:
char b = 201;
它可以正常工作。
所以我意识到在向量中,由于某种原因,char类型可以在127之前接收int值。开始128语法错误出现。
这与正常变量不同,当char类型可以接收任何int值时。
我尝试将矢量声明为未签名的char,而语法错误则消失。
vector <unsigned char> a = { 201, 187, 200, 188, 205, 186 };
但仍然,
为什么char类型向量无法接收与char类型变量相同的int数据?
我真的很感谢有人解释我这种行为。
有两件事。
1
第一个是char
类型的默认值范围,它是实现定义的。在大多数主要编译器中,默认值为[-128,127]。(奇怪的是,这与不像signed char
,JSYK!)
MSVC和GCC都提供了将char
视为签名或未签名的选项。您可以这样做以在全球解决问题。
更好的是,不要假设char
处理范围之外的任何内容[0,127]。使用signed char
或unsigned char
是特定的。
2
第二个是您正在使用支撑初始化,该初始化需要检查字面元素值以拟合范围。
为您的示例:
std::vector <char> xs = { 201, 202 }; // compiler error
char x { 201 }; // compiler error
char x = 201; // compiler warning
如果您没有编译器的错误级别(并且应该),那么编译器将默默地忽略该警告并分配该值,即使它在技术上无效。
没有内置的方法可以做到这一点,因为字符文字仅以单引号为单,而数字(无后缀)是ints。您可以添加L,LL,UL,ULL来制作一个字面的长,长长的且未签名的版本,以及其他一些用于浮点等的版本,但是没有此类后缀。
但是,如果您有C 11或以后的编译器,则可以编写自己的用户定义的文字来帮助:
constexpr char operator "" _c(unsigned long long arg) noexcept
{
return static_cast<char>(arg);
}
int f()
{
std::vector <char> a = { 201_c, 187_c, 200_c, 188_c, 205_c, 186_c };
}
如果这不是一个选项,或者您只是不喜欢它,您总是可以写一个普通的功能来做类似的事情:
constexpr char c(int arg) noexcept
{
return static_cast<char>(arg);
}
int f()
{
std::vector <char> a = { c(201), c(187), c(200), c(188), c(205), c(186) };
}
- 为什么我在向量初始化时收到此错误?
- 使用向量初始化参数化构造函数的对象数组
- C++向量初始化遗传算法的代理向量
- shared_ptr类的向量的向量初始化问题
- 如何实现使用 gcc-4.4 编译的大向量初始化?
- 使用向量初始化C++中的链表
- C++ 中的向量初始化
- 如何使用嵌套初始化构造函数中的一维向量初始化矩阵
- std::另一个函数中的向量初始化
- 理解向量初始化时出现问题
- 静态常量 std::<char>没有堆的向量初始化?
- 向量初始化在 C++ 类中失败
- 具有从特定范围的随机数初始化特征矩阵或向量初始化特征矩阵或向量的有效方法
- 关于向量初始化的一些问题
- 了解C 中的向量初始化
- 设置::使用数字中的引号进行向量初始化
- VS2010中的向量初始化
- C++:构造函数中的向量初始化
- 如何从向量初始化数组?(如何将指针强制转换为数组?)
- 给我一个向量初始化的提示或(答案)