gpt4 book ai didi

c++ - boost::lexical_cast 输出错误

转载 作者:太空狗 更新时间:2023-10-29 20:19:47 26 4
gpt4 key购买 nike

bool 变量作为输入的 boost::lexical_cast 的输出预计为 01 值(value)。但是我得到了不同的值。

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

#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("%s\n", 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 异常。

我的 boost 版本:1.58

Live sample

最佳答案

C++ 标准没有指定 bool 值如何存储在内存中,只是指定了两个可能的值:truefalse。现在,在您的机器上,我假设它们分别存储为 10。允许编译器做出假设,特别是允许假设这些将是存储在 bool 值中的仅有的两个值。

因此,当 boost::lexical_cast 看到 bool 值时,它运行的代码可能看起来像这样(优化后)

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

如果 value01,这可以正常工作并且可以满足您的要求。但是,您将 71 放入其中。所以我们把'0'的ASCII码(48)加到71上,得到119,即ASCII码'w'.

现在,我不是 C++ 标准专家,但我猜想使用memcpy 将非标准值存储到 bool 值中是未定义的行为。至少,您的代码是不可移植的。就此而言,也许更精通该标准的人可以填补我的知识空白。

关于c++ - boost::lexical_cast 输出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56527471/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com