言語 - C++ 17 std:: to_charsにnullターミネータを追加していますか?




ヌル ポインタ c 言語 (2)

C ++ 17仕様では、 to_charsにNULターミネータを追加することは述べられていません。

to_charsという名前のすべての関数は、範囲[ firstlast )を連続して満たすことによって、 valueを文字ストリングに変換しvalue 。ここで、[ firstlast )は有効な範囲である必要があります。 戻り値のメンバecが、 boolに変換されたときの値がfalseになるようなものであれば、変換は成功し、メンバptrは書き込まれた文字の最後から1つ前のポインタです。 そうでなければ、メンバーecは値errc::value_too_large 、メンバーptrは値lastを持ち、範囲[ firstlast )の内容は指定されていません。

その段落や個々のto_charsオーバーロードの動作を明確に定義する段落には、NULターミネータについては何も述べられていません。 したがって、それは書いていません。

to_charsが9文字を超えない限り、この例は機能します。 strはすべてのNUL文字に初期化されるため、 str書き込まれていないものはすべてNUL文字のままになります。

これに加えて、それを提案したオリジナルの論文P0067R0は、 to_chars関数が文字列をNUL終了してはならないと明示的に述べています。

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

参照はそれについて何も言いません、しかし、例は(私にとって)明らかにnullで終わる文字列を使っています、さもなければstd::array::dataはポインタだけを返すのでそれがどこで終わるべきか知ることができるでしょう。

#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 ://en.cppreference.com/w/cpp/compiler_support

編集: strがゼロで初期化されていることを忘れて、質問はまだ関連しています。


cpprefrence(最初のリンク)で述べられているように

デフォルトのロケール( "C")では、値はstd :: sprintfと同じように文字列に変換されます。

sprintfそうではありません(値を挿入するとき)。







string-conversion