调用 std::to_chars 的正确方法是啥?

Posted

技术标签:

【中文标题】调用 std::to_chars 的正确方法是啥?【英文标题】:What is the correct way to call std::to_chars?调用 std::to_chars 的正确方法是什么? 【发布时间】:2020-09-18 23:34:44 【问题描述】:

我想打电话给std::to_chars 加倍。我的代码无法在我拥有的任何编译器上编译(gcc 10.2、clang 10.0.1)。

最小可重现代码 (or on godbolt):

#include <charconv>
#include <string>
int main() 
    std::string str;
    str.resize(30);
    auto[ptr, ec] = std::to_chars(str.data(), str.data() + str.size(), double(3.5));

我用-std=c++17 编译。 我得到的错误是:

在 gcc 10.2 上:

<source>: In function 'int main()':
<source>:7:83: error: call of overloaded 'to_chars(char*, char*, double)' is ambiguous
    7 |     auto[ptr, ec] = std::to_chars(str.data(), str.data() + str.size(), double(3.5));
      |                                                                                   ^
In file included from <source>:1:
/.../gcc-10.2.0/include/c++/10.2.0/charconv:366:1: note: candidate: 'std::to_chars_result std::to_chars(char*, char*, char, int)'
...

然后它会列出所有候选者。

在 clang 10.0.1 上,它几乎只是告诉我:

<source>:7:21: error: no matching function for call to 'to_chars'
    auto[ptr, ec] = std::to_chars(str.data(), str.data() + str.size(), double(3.5));
                    ^~~~~~~~~~~~~

我用double 尝试了cppreference's page on std::to_chars 上列出的所有重载,它们都给出了不同的错误,但最终没有任何效果。

我不明白为什么重载决议在应该明确的时候不明确,还是我在这里做的根本错误?

我想补充一点,MSVC 运行良好,没有任何错误。

【问题讨论】:

在我看来 std::to_chars_result to_chars(char* first, char* last, double value); 重载尚未在 libc++ 或 libstdc++ 中实现。用int 调用它可以工作。 @bolov 是的,它在 MSVC 上工作得很好——看起来很奇怪,我认为 gcc 至少完全符合 c++17。猜不出来? 关闭这是荒谬的。 “正确”的答案是我称之为正确的方式,但 gcc & clang 还没有实现它。它不是重复的,“重复”甚至无法远程回答我的问题。 @bolov:那个副本没有回答问题。它只是说明实现这些功能并非易事;这实际上并没有说明任何特定编译器的任何特定版本是否实现了该功能。另一个问题顺便提到当时没有供应商实施它们,但即使是这种说法也已经过时了。 【参考方案1】:

您的使用非常好,它在 MSVC 19 下可以正确编译。如Microsoft Docs for the <charconv> functions 中所述,这至少需要 C++17。

正如您在The GNU C++ Library Manual, Chapter 1. Status, C++ 2017 中看到的那样,关于 P0067R5(基本字符串转换,修订版 5)的最新更新是在 GCC 8.1 上,并带有注释“仅支持整数类型”。

同样,the libc++ C++17 Status 将 P0067R5 定义为“部分完成”。

如果您需要更多证据证明这是您的 C++ 实现的问题,请查看 GCC/Clang 安装的包含文件,您会发现它没有定义浮点重载(它们没有定义对我来说,使用 GCC 10.2.1)。

【讨论】:

是的 - 你是对的,标题甚至没有提到浮点值!谢谢

以上是关于调用 std::to_chars 的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

从同步代码调用异步方法并阻塞直到任务完成的正确方法是啥? [复制]

分配数据以传递给 FFI 调用的正确方法是啥?

Spring Security:在后台任务中调用@PreAuthorize 保护的方法的正确方法是啥?

在 react js 中进行 API 调用的正确方法是啥?

使用 Prisma 和 Apollo 调用多个 GraphQL 突变的正确方法是啥

使用 VueX Store 中的计算属性进行 Ajax 调用的正确方法是啥