为什么 Boost Format 和 printf 在相同的格式字符串上表现不同

ToB*_*oBe 6 c c++ printf boost boost-format

Boost Format 文档说:

它的目标之一是提供 printf 的替代品,这意味着 format 可以解析为 printf 设计的格式字符串,将其应用于给定的参数,并产生与 printf 相同的结果。

当我使用相同的格式字符串比较 boost:format 和 printf 的输出时,我得到了不同的输出。在线示例在这里

#include <iostream>
#include <boost/format.hpp>

int main()
{
    boost::format f("BoostFormat:%d:%X:%c:%d");

    unsigned char cr =65; //'A'
    int cr2i = int(cr);

    f % cr % cr % cr % cr2i;

    std::cout << f << std::endl;
    printf("Printf:%d:%X:%c:%d",cr,cr,cr,cr2i);
}
Run Code Online (Sandbox Code Playgroud)

输出是:

升压格式: A:A:A:65

打印输出: 65:41:A:65

不同之处在于当我想将字符显示为整数类型时。

为什么有区别?这是一个错误还是想要的行为?

jof*_*fel 6

这是预期的行为。

boost 手册中,它描述了您使用的经典类型规范:

但是 printf 的经典类型规范标志在格式上的意义较弱。它仅在内部流和/或格式化参数上设置适当的标志,但不要求相应的参数为特定类型。

另请注意,在 stdlib-printf 调用中charint由于 vararg调用,所有参数都会自动转换为。所以生成的代码与:

printf("Printf:%d:%X:%c:%d",cr2i,cr2i,cr2i,cr2i);
Run Code Online (Sandbox Code Playgroud)

这种自动转换不是由%操作员完成的。