首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost::lexical_cast错误输出

boost::lexical_cast错误输出
EN

Stack Overflow用户
提问于 2019-06-10 13:33:33
回答 2查看 500关注 0票数 7

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

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

代码语言:javascript
复制
#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" (ASCII代码w是71)作为输出!但我希望它是一个01值。

问题只是bool变量将转换到这个值中。给定示例中的bool变量已经被认为是正确的。造成问题的原因是,假设我想要将转换后的值转换回来。这是它抛出异常的地方,因为例如"w“字符不能转换为bool。但如果输出为01,则可以重新转换。

代码语言:javascript
复制
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中的一个bug

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

我的助推版本: 1.58

活样品

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-10 13:49:01

C++标准没有指定布尔值是如何存储在内存中的,只是有两个可能的值:truefalse。现在,在您的机器上,我想它们分别存储为10。编译器可以进行假设,特别是允许它假设这是存储在布尔值中的唯一两个值。

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

代码语言:javascript
复制
// 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的布尔值中是未定义的行为。至少,您的代码不可移植。也许一个更精通这个标准的人可以填补我知识中的漏洞。

票数 7
EN

Stack Overflow用户

发布于 2019-06-10 13:50:42

你违反了规则。您期望的是,C++会在程序中添加无用的代码来捕获规则破坏者吗?

布尔变量只能为0或1,为false或true。如果你按照规则正确地分配给他们,他们就是。

如果您对它们或reinterpret_cast进行了备份,那么底层实现就会显示出来。bool是一个内存字节。如果它以某种方式被设置为0或1以外的东西,那么它就存在了。

我不得不再检查一遍,但我甚至不确定你是否保证一个bool是一个字节。我想你可以拿个指针。但是,如果硬件有某种方法来创建指向某个位的指针,您可能会对C++如何处理它感到非常惊讶。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56527471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档