是什么阻碍了 std::to_chars 和 std::from_chars 的实施

What blocks implementation of std::to_chars and std::from_chars

根据 https://en.cppreference.com/w/cpp/compiler_support#cpp17,还没有主要供应商支持 std::to_charsstd::from_chars 的浮点版本。我知道正确格式化浮点数是非常重要的,但 C 库中存在实现。但是这些都是受环境影响的,这也是标准中加入std::to_charsstd::from_chars的原因之一。如果您重构 C 库以依赖于将实际转换基础转换为某种中间格式的常见低级例程,那么这些函数的实现不会免费提供。然后 std::to_charsstd::from_chars 或多或少可以直接使用结果,而 C 和 C++ 中更高级的 API:s (printf, atof, strtod, std::stof, std::to_string) 可以做一些更花哨的事情。

to/from_chars 功能要求实现提供往返保证(与它们自己)。具体来说,以下必须有效:

float f = //get some float
char chars[LOTS_OF_CHARS];
auto result = to_chars(chars, chars + sizeof(chars), f);
float g;
from_chars(chars, result.ptr, g);
assert(f == g);

这种保证实际上有点难以实现,none 标准库 C 或 C++ 浮点到字符串到浮点函数 曾经提供了保证。所以你不能只从 printf/scanfstof/to_string 中获取代码,撕掉语言环境的东西,然后称之为 to/from_chars 实现。

这是一半答案,一半问题:

我找到了一个关于提到要求的主题的讨论帖

The string representation consists of the smallest number of characters such that there is at least one digit before the radix point (if present) and parsing the representation using the corresponding std::from_chars function recovers value exactly

但是 C 库不支持。但是,如果措辞是至少正确往返所需的字符数,那么我猜

std::lock_guard l{local_mutex};
auto loc = setlocale(LC_ALL, nullptr);
setlocale(LC_ALL, "C");
char buffer[24]{};
sprintf(buffer, "%.17g", val);  // change to 9 for float
setlocale(LC_ALL, loc);

应该可以。我说得对吗?