【发布时间】: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:那个副本没有回答问题。它只是说明实现这些功能并非易事;这实际上并没有说明任何特定编译器的任何特定版本是否实现了该功能。另一个问题顺便提到当时没有供应商实施它们,但即使是这种说法也已经过时了。