私は書いていました この答え そして私は http://en.cppreference.com/w/cpp/string/byte/tolower#Parameters から引用しました
Unsigned charとして表現できず、EOFと等しくない、動作は定義されていません
私が調べに行ったとき このフレーズを追加した編集 著者のコメントが見つかりました:
C99 7.4/1に準拠したctype.h関数で負の符号付き文字を使用することはできません
著者は、C++ドキュメントのC99標準から引用しています。それは有効ですか? C++標準ではこの関数の定義について何も見つからなかったので、それが有効であると想定する必要があります。
しかし、これは2つの理由で私に関係しています。
最初の質問の場合:
C++標準は、依存するC標準を規範的参照セクションに明示的にリストします。 C++ 14の場合、[intro.refs] 1.2/1はC99をリストします。
- ISO/IEC 9899:1999、プログラミング言語— C
- ISO/IEC 9899:1999/Cor.1:2001(E)、プログラミング言語— C、技術正誤表1
- ISO/IEC 9899:1999/Cor.2:2004(E)、プログラミング言語— C、技術正誤表2
- ISO/IEC 9899:1999/Cor.3:2007(E)、プログラミング言語— C、技術正誤表
2番目の質問の場合:
C++標準には、C標準のany部分が暗黙的に組み込まれていません。 C標準へのすべての参照は明示的です。 C++がCから逸脱している場所に関する優れた情報源は、付録C、C++標準の「互換性」、特にC.1 [diff.iso]です。
さらに、C標準ライブラリへの参照は、C++標準ライブラリの説明全体に散在しています(C++ 14の第17〜30章)。特に興味深いのは次のとおりです。
<c:::>
ヘッダーの多くについて説明しています。C++標準が依存しているC標準のバージョンをどのように知ることができますか?
C++ 14では、N4140の1.2 [intro.refs]に記載されているように、ISO/IEC 9899:1999(および3つのコリジェンダム、つまり本質的にC99)です。 C++ 98ではC90、C++ 17ではおそらくC11になりますが、C++標準では常にそれが明示されます。
C++を参照してC標準を見ている場合、見ている領域がオーバーライドされているかどうかをどうやって知ることができますか?
C++標準を見ると、C定義からrestrict
を引いたもの、または必要なC動作を明示的にインポートするか、明示的に変更を加えています。
通常、標準自体の代わりに優れたドキュメントを読むと、問題なく機能します。
最初の質問に対処するには:
著者は、C++ドキュメントのC99標準から引用しています。それは有効ですか?
はい、なぜなら
1 表74 [
std::tolower
、meを含む]、75、76、77、78、および79は、それぞれヘッダー<cctype>
、<cwctype>
、<cstring>
、<cwchar>
、<cstdlib>
(文字変換)、および<cuchar>
について説明しています。
2 これらのヘッダーの内容は、標準Cライブラリヘッダー<ctype.h>
、<wctype.h>
、<string.h>
、<wchar.h>
、および<stdlib.h>
と、C Unicode TRヘッダー<uchar.h>
とそれぞれ同じですが、次の変更が加えられています[これらはいずれもstd::tolower
には適用されません。
N4140の21.8 [c.strings]
編集は正しく、この特定のテキストはC90以降標準になっています。
C904.3から
ヘッダーは、文字のテストとマッピングに役立ついくつかの関数を宣言します。すべての場合において、引数はintであり、その値はunsigned charとして表現可能であるか、マクロの値と等しくなければなりませんEOF。引数に他の値がある場合、動作は次のようになります。未定義。
C11 7.4/1から
ヘッダーは、文字の分類とマッピングに役立ついくつかの関数を宣言します。すべての場合において、引数はintであり、その値はunsigned charとして表現可能であるか、マクロEOFの値と等しくなければなりません。引数に他の値がある場合、動作は未定義です。
同一のテキスト; Cはいつもこんな感じでした。したがって、すべてのCバージョンは同等であるため、特定のC++バージョンがどのCバージョンを使用するかは問題ではありません。