从char到string下面演员的正确结果是什么?
我听说旧的提升版 1.46 lexical_cast输出 56 ,我附近没有那个我无法测试它的版本。但 boost library(1.49)输出为:8
unsigned char c= 56;
std::string s = boost::lexical_cast<std::string>(c);
std::cout << "boost::lexical_cast: " << s << std::endl;
C ++ 11 to_string输出为:56
std::cout << "std::to_string: " << std::to_string(c) << std::endl;
答案 0 :(得分:8)
std::to_string
仅为数字类型提供重载,在这种情况下可能会解析为unsigned
版本。 lexical_cast
,OTOH,依靠std::ostream::operator<<
执行转化,从而将c
视为一个角色。
答案 1 :(得分:5)
两者都是正确的。 to_string
并不关心c
类型为char
,它会读取其中的数字并将其转换为字符串。
另一方面,lexical_cast<std::string>
似乎将char
类型的变量解释为ascii值。 56是ascii值8。
答案 2 :(得分:3)
旧的升级版本不正确。
lexical_cast
的结果应该与流式传输到ostream相同。所以
std::cout << boost::lexical_cast<std::string>(x)
与
相同std::cout << x
如果unsigned char
表示将x解释为ASCII码,则对于其他整数类型,它将给出与itoa
相同的结果。这是因为ostream不会将char
类型视为算术整数(参见§27.3.6.2vs§27.3.6.4)。这种方法的优点是您可以通过输出单个字符来输出字符串。如果需要实际数值,则始终可以将char转换为算术类型以进行输出。
to_string
对于所有整数数据类型都像itoa
一样工作,因为它没有unsigned char
的重载。这里的基本原理是,通过调用to_string
,您已经表达了执行转换的意图,即您对值的字符类型质量(这将是默认值)不感兴趣,而是对算术类型质量感兴趣。
答案 3 :(得分:2)
这是一个解释问题。如果将char
解释为小整数,则在当前字符集中打印其代码;这就是to_string
似乎正在做的事情。
如果您将其解释为要打印的字符,请发出相应的字符,即8
为boost::lexical_cast
。
答案 4 :(得分:1)
这不是char到字符串,它是字符串的“unsigned char”。他们都是正确的。 lexical_cast使用stringstream实例进行转换,而std :: to_string因无符号而重载,这意味着unsigned char被提升为unsigned int。