以boost::lexical_cast变量作为输入的bool的输出预期为0或1值。但我却得到了不同的价值。
这不是正常发生的事。让我们看一看我编写的示例代码:
#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)作为输出!但我希望它是一个0或1值。
问题只是值,bool变量将将转换到这个值中。给定示例中的bool变量已经被认为是正确的。造成问题的原因是,假设我想要将转换后的值转换回来。这是它抛出异常的地方,因为例如"w“字符不能转换为bool。但如果输出为0或1,则可以重新转换。
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
发布于 2019-06-10 13:49:01
C++标准没有指定布尔值是如何存储在内存中的,只是有两个可能的值:true和false。现在,在您的机器上,我想它们分别存储为1和0。编译器可以进行假设,特别是允许它假设这是存储在布尔值中的唯一两个值。
因此,当boost::lexical_cast看到布尔值时,它运行的代码可能如下(优化后)
// Gross oversimplification
std::string lexical_cast(bool value) {
char res = '0' + (int)value;
return std::string(1, res);
}如果value是0或1,那么它工作得很好,可以做您想做的事情。但是,您在其中添加了一个71。因此,我们将'0' (48)的ASCII代码添加到71中,得到119,即'w'的ASCII代码。
现在,我不是C++标准专家,但我猜想将非标准值存储到带有memcpy的布尔值中是未定义的行为。至少,您的代码不可移植。也许一个更精通这个标准的人可以填补我知识中的漏洞。
发布于 2019-06-10 13:50:42
你违反了规则。您期望的是,C++会在程序中添加无用的代码来捕获规则破坏者吗?
布尔变量只能为0或1,为false或true。如果你按照规则正确地分配给他们,他们就是。
如果您对它们或reinterpret_cast进行了备份,那么底层实现就会显示出来。bool是一个内存字节。如果它以某种方式被设置为0或1以外的东西,那么它就存在了。
我不得不再检查一遍,但我甚至不确定你是否保证一个bool是一个字节。我想你可以拿个指针。但是,如果硬件有某种方法来创建指向某个位的指针,您可能会对C++如何处理它感到非常惊讶。
https://stackoverflow.com/questions/56527471
复制相似问题