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

6

我正在尝试对一个双精度浮点数调用 std::to_chars。我的代码在所有编译器上都无法编译(包括gcc 10.2和clang 10.0.1)。

最简可复现的代码(或者在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));
                    ^~~~~~~~~~~~~

我尝试了所有在cppreference的std::to_chars页面中列出的针对double类型的函数重载,它们都产生不同的错误,但最终没有一种能够正常工作。

我不明白为什么在应该明确的情况下重载分辨率不清楚,或者我在这里做了什么根本性的错误吗?

我想补充说明的是,MSVC可以正常运行而没有任何错误。


在我的看法中,std::to_chars_result to_chars(char* first, char* last, double value); 重载似乎尚未在libc++或libstdc++中实现。使用 int 调用它是可以的。 - bolov
1
@bolov 是的,在 MSVC 上它可以正常工作 - 看起来很奇怪,我认为至少 gcc 是完全符合 c++17 的。也许不是这样? - lionkor
1
关闭这个问题是荒谬的。 “正确”的答案应该是我所称呼的方式是正确的,但gcc和clang尚未实现它。 这不是重复的,而且“重复”的根本没有回答我的问题。 - lionkor
2
@bolov:那个重复的问题并没有回答这个问题。它只是说明实现这些函数并不容易;这并没有实际上说明任何特定版本的编译器是否实现了这个函数。另一个问题顺便提到在那个时候没有供应商实现它们,但即使是这个说法也已经过时了。 - Nicol Bolas
1
更新:现在gcc 11已经实现了它。 - Elmar Zander
1个回答

8
您的使用方式完全正确,并且在MSVC 19下编译正确。正如 Microsoft <charconv> functions文档中所述,这需要至少C++17。
您可以在GNU C++ Library手册的第1章中自己看到,有关P0067R5(基本字符串转换,修订版5)的最后更新是在GCC 8.1上,带有“仅支持整数类型”的注释。
同样地,
libc ++ C ++17状态将P0067R5定义为“部分完成”。
如果您需要更多证据表明这是您的C ++实现问题,请查看您的GCC / Clang安装的包含文件,您将看到它不定义浮点重载(对我来说,在GCC 10.2.1中未定义)。

是的 - 你说得对,标题甚至没有提到浮点数值!谢谢。 - lionkor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接