提升::lexical_cast错误的输出

boost::lexical_cast wrong output

本文关键字:输出 错误 lexical 提升 cast      更新时间:2023-10-16

bool变量作为输入的boost::lexical_cast的输出应为01值。但我得到了不同的价值。

这不是正常发生的事情。让我们看一下我编写的示例代码:

#include <string>
#include <boost/lexical_cast.hpp>
int main()
{
bool alfa = true;    // Doesn't metter whether alfa is initialized at definition or not 
char beta = 71;    // An integer value. Different values don't make any differences.
memcpy(&alfa, &beta, sizeof(alfa));
printf("%sn", boost::lexical_cast<std::string>(alfa).c_str());
}

从这个代码中,我得到了"w"(w 的 ASCII 代码是 71)作为输出!但我希望这是一个01值。

问题只是bool变量将转换为的值。给定示例中的bool变量已被视为 true。 导致问题的是想象我想转换回转换后的值。这就是它引发异常的地方,因为例如"w"字符无法转换为bool。但是如果输出是01,重新转换是可能的。

std::string converted_value = boost::lexical_cast<std::string>(alfa);
bool reconverted_value = boost::lexical_cast<bool>(converted_value );   // In this line, boost::bad_lexical_cast will be thrown

我想知道输出是否正确,或者这是boost::lexical_cast中的错误?

同样,当我尝试做同样的事情并将变量转换为int时,我遇到了boost::bad_lexical_cast例外。

我的加速版本:1.58

现场样品

C++ 标准没有指定布尔值在内存中的存储方式,只是有两个可能的值:truefalse。现在,在您的机器上,我认为这些分别存储为10.编译器可以做出假设,特别是允许假设这些将是存储在布尔值中的唯一两个值。

因此,当boost::lexical_cast看到布尔值时,它运行的代码可能如下所示(优化后)

// Gross oversimplification
std::string lexical_cast(bool value) {
char res = '0' + (int)value;
return std::string(1, res);
}

如果value01,这工作正常,可以满足您的需求。但是,您在其中放了一个71。所以我们加上'0'(48)的ASCII码到71得到119,即'w'的ASCII码。

现在,我不是一个C++标准专家,但我猜想将非标准值存储到具有memcpy的布尔值中是未定义的行为。至少,您的代码是不可移植的。也许更精通标准的人可以填补我的知识漏洞。

你违反了规则。你期望什么,C++会向你的程序添加无用的代码来捕获规则破坏者?

布尔变量只能为 0 或 1,假或真。如果您正确分配它们,它们是根据规则进行的。

如果你对它们进行记忆或reinterpret_cast那么底层实现就会显现出来。bool是一个内存字节。如果它以某种方式设置为 0 或 1 以外的内容,那么它就是这样。

我必须仔细检查,但我什至不确定您是否保证布尔值是一个字节。我想你可以用指针指向它。但是,如果硬件有某种方法可以创建指向一位的指针,您可能会对C++对此所做的工作感到非常惊讶。