C++17 std::to_chars 是否添加空终止符?

Is C++17 std::to_chars adding a null terminator?

http://en.cppreference.com/w/cpp/utility/to_chars

Reference 没有说明什么,但是这个例子(对我来说)清楚地使用了一个以 null 结尾的字符串,否则它怎么知道在哪里结束,因为 std::array::data returns 只有一个指针。

#include <iostream>
#include <charconv>
#include <array>

int main()
{
    std::array<char, 10> str{};
    std::to_chars(str.data(), str.data()+str.size(), 42);
    std::cout << str.data();
}

不幸的是我无法自己测试它,因为 AFAIK 还没有编译器支持它: https://en.cppreference.com/w/cpp/compiler_support

编辑: 忘记了 str 是用零初始化的,但是问题仍然相关。

如 cpprefrence 所述(您的第一个 link)

value is converted to a string as if by std::sprintf in the default ("C") locale.

所以不,它不会添加空终止符,因为 sprintf 也不会(插入值时)。

C++17规范没有​​说明to_chars添加了一个NUL终止符:

All functions named to_chars convert value into a character string by successively filling the range [first, last) , where [first, last) is required to be a valid range. If the member ec of the return value is such that the value, when converted to bool, is false, the conversion was successful and the member ptr is the one-past-the-end pointer of the characters written. Otherwise, the member ec has the value errc::value_too_large, the member ptr has the value last, and the contents of the range [first, last) are unspecified.

该段或专门定义单个 to_chars 重载行为的段落中没有说明 NUL 终止符。所以就不写了。

只要 to_chars 不产生超过 9 个字符,该示例就可以工作。由于 str 被初始化为所有 NUL 字符,任何未写入 str 的内容都将保留为 NUL 字符。


此外,提出它的原始论文 P0067R0 明确指出 to_chars 函数不应 NUL-terminate 字符串。