在下面的代码片段(live)中,第三个print语句导致了大量的错误消息:
#include <stdfloat>
#include <fmt/core.h>
int main()
{
auto num1 { std::float64_t{1.1f64} };
fmt::println( "{}", num1 );
auto num2 { static_cast<long double>(1.2) };
fmt::println( "{}", num2 );
auto num3 { std::float128_t{1.3f128} };
fmt::println( "{}", num3 ); // compile-time error
}
std::float16_t
也是如此。
为什么这两种类型不被{fmt}格式化?是因为它们还没有实现,还是需要特定的格式说明符?我检查了documentation,但找不到任何相关信息。
1条答案
按热度按时间oyjwcjzk1#
问题是**{fmt}**本身没有为扩展浮点类型提供任何格式化程序。尝试格式化
std::float128_t
将在某种程度上导致不明确的重载,因为它可以转换为:int
long
libstdc++不实现
operator<<(std::float128_t)
,可能不需要。如果std::float128_t
的秩大于long double
,则可能不支持。double
的秩,则像(6)中那样插入static_cast<double>(value)
。static_cast<long double>(value)
,如(7)所示。*否则,此重载的调用将有条件地支持实现定义的语义。
std::ostream::operator<<
这意味着我们也不能依赖
#include <fmt/ostream.h>
作为后备选项。同时,您可以使用已迁移到标准的**{fmt}**功能:
std::println
,但是libstdc++还没有实现<print>
*标签:C++ compiler support