【发布时间】:2020-08-21 13:55:06
【问题描述】:
查看char 在vector<char> 和独立char 的情况下的行为:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> someInts = {2, 3, 1 + 5};
// I can perform operations ^^^^^ inside the braces in this case
// vector<char> someChars = {'a', 'b', 'r' + 'z'};
// But doing the same in case of char ^^^^^^^^^ gives an error
// However, it works for a standalone char
char ch = 'r' + 'z';
cout << ch;
// Value^^^is '∞' as expected
}
取消注释 vector<char> 行给出:
错误:在 {}
内将“236”从“int”缩小到“char”
这就是问题所在。
然后我阅读了 List Initialization 的this 文档,看到了可能与此问题有关的以下内容:
缩小转化范围
list-initialization 通过以下方式限制允许的隐式转换 禁止:
- 许多其他原因
- 从整数或无作用域枚举类型转换为不能表示原始所有值的整数类型,除非在 source 是一个常量表达式,其值可以精确存储 在目标类型中
它让我理解了错误消息(我猜),我将 vector<char> 更改为 vector<unsigned char> 并且它起作用了:
vector<unsigned char> someChars = {'a', 'b', 'r' + 'z'};
for (char ch : someChars)
cout << '_' << ch;
输出:
_a_b_∞
所以,我的问题是:
如果
char的签名 是问题所在,那么char的独立版本在这种情况下如何工作?参考stackoverflow上的this线程,同一个编译器如何为vector<char>选择signed char,为unsigned char选择char?如果我对问题的推断是错误的,那么这个问题背后的正确原因是什么?
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
标签: c++ vector char int list-initialization