小编Wal*_*dal的帖子

为什么 std::format() 会在运行时抛出错误的格式说明符?

最近我发现以下代码在几个主要编译器上编译,然后在运行时抛出:

std::cout << std::format("{:*<{}}", 10, "Hello") << std::endl;
Run Code Online (Sandbox Code Playgroud)
terminate called after throwing an instance of 'std::format_error'
  what():  format error: argument used for width or precision must be a non-negative integer
Run Code Online (Sandbox Code Playgroud)

它会抛出异常,因为“10”应该出现在“Hello”之后,而不是之前。

但明显的问题是:为什么它在编译时没有失败?我的理解是,这些参数将在编译时进行类型检查,显然 aconst char*不能用作宽度说明符。为什么这不是编译错误?

如果您不明白为什么这会令人困惑,请知道 的第一个参数std::format()是 type std::format_string<...>此类型在编译时采用字符​​串文字/字符串视图(由于其consteval构造函数),并在编译时读取给定字符串的内容以查看格式参数是否与格式字符串匹配。因此,保证不会std::format("{}");编译,因为字符串“{}”在编译时被读取为格式说明符,但类型列表显示没有传递任何参数,那么该空间中会放入什么?

c++ fmt

20
推荐指数
1
解决办法
687
查看次数

标签 统计

c++ ×1

fmt ×1