C ++標準ライブラリをC ++で実装する必要がありますか?

  1. Must a conforming C++ Standard Library Implementation be implemented in C++?
  2. If not, is it allowed to do magic things that are not doable in pure C++ & Standard Library & some implementation defined behaviour?

  • 拡張機能に依存する(少なくともC ++ 11以前の)並列実装は存在しますが、
  • 標準では要件が見つかりませんでしたが、
12
私は連合国の言葉を思い出しています。「大統領が議会にウォールストリートジャーナルを購読すれば、彼は憲法上の義務を果たしました!」
追加された 著者 spraff,
"as if"ルールは、実装が好みの実装を選択できるようにします。
追加された 著者 Raymond Chen,

3 答え

There is no requirement at all how the standard C++ library (or the standard C library for that matter) is implemented. All the library needs to achieve is to implement the documented and specified interface. How this is done is entirely up to the implementation. Part of standard libraries are often implemented by the compiler in some magic way and in C++2011 there are several interfaces which actually cannot be implemented using standard C++2011 language facilities! Primarily this is true for some of the traits in but there are other things.

参照のためだけに:C ++がどのように実装されているのか、それが実際に標準に準拠していることが実際には何を意味するのかは非常に曖昧です。関連する節は1.4 [intro.compliance]です。しかし、単に診断が発行され、プログラムが何をしなければならないか、リソースの制限に制約されているかについて話すだけです。

19
追加された
標準言語機能を使用して実装できないものを見つけるために、最近の追加は必要ありません。言語そのものにはIOの概念がないので、 filebuf et al。もっと何かが必要です(Posix、とにかく---それは標準C ++ではありません)。実際、小さなコミュニティであっても、何かが役に立ちますが、標準的な言語構造では実装できないという事実は、それをライブラリに追加する動機です。 (Cでは、これは offsetof の引数です)。
追加された 著者 James Kanze,
@phresnel私はそうは思わない、少なくともC + +の面ではない。 C ++には、OSからプログラムにバイトを転送する言語構造はありません。また、C ++標準では、標準で指定されていないものは未定義の動作であると言います。 (そして、これは最も厳しい言語弁護士です。実際にはPosixのような他の基準が、行動を定義するあなたの処分に常にあります。)
追加された 著者 James Kanze,
@DietmarKühlどのように? C ++言語の外に出ることなく、どのようにバイトをOSからC ++オブジェクト( char の配列など)にするのですか?プログラム外のバイト数)?
追加された 著者 James Kanze,
@phresnel:私はコンパイラのサポートなしでは実装できないものを簡単に利用できる包括的なリストを持っていません。しかし、 is_trivially_default_constructible のようなものは、デフォルトのコンストラクタが実際に宣言されているか、合成されているかについての情報をテストする必要があります。いくつかのコンパイラは様々な型の特性を実装しますが、コンパイラは多少の人為的なインスタンス化を調べるのではなく、特定の特性を伝えるのにかなり効率的なので、絶対に必要以上に実装します。
追加された 著者 Dietmar Kühl,
@ JamesKanze:そうですね、標準ではファイル記述子のアクセス方法などは定義されていません。ただし、ファイル記述子ファミリーの関数(POSIXプラットフォームなど)を使用できるプラットフォームを使用している場合は、対応するシステムコールを呼び出すことなく、C ++ですべてのファイルストリーム操作を実装できます。私はこれが "C ++で実装されている"と考えていますが、これが意味することの他の定義はかなり合理的です。
追加された 著者 Dietmar Kühl,
@ JamesKanze:私はそれを使用することに同意します。 POSIX関数は、C ++標準の範囲外であり、対応する機能(Cライブラリ、トラップなど)を使用せずに、実装することはできません。ファイルストリーム。明らかに、ライブラリを含む標準は標準C ++では実装できません。
追加された 著者 Dietmar Kühl,
+1:私は中程度のテンプレート作家であるので、どのタイプの特質が本当に好奇妙なのですか?
追加された 著者 Sebastian Mach,
@ JamesKanze:私は、実装定義の振る舞いを含めるために、私の2番目の質問を少し洗練しました。それはIO要件を飽和させるべきではないか?
追加された 著者 Sebastian Mach,

いいえ。

Actually, it is even prescribed by the Standard that #include (for example) could simply import a pre-stored AST and not refer to a file, at all.

9
追加された
これを受け入れるようにしてください。 Dietmarsの答えはあなたよりも具体的ではありません。
追加された 著者 Sebastian Mach,

まったく、インターフェイスだけがC ++である必要があります。

2
追加された
@DietmarKühl私は、この技術がVisual Ageによって実際に使用されたと信じています。
追加された 著者 James Kanze,
これはどういう意味ですか? #include にファイルを含める必要はありません:翻訳単位で利用可能になる特定の定義についてコンパイラに通知するだけです。インタフェースはC ++でもかまいません。しかし、あなたは interface とは何を考えているかによって多少異なります...
追加された 著者 Dietmar Kühl,
私はそう思います(しかし、推測は質問の一部ではありません:))、私は参照や引用を探していました。
追加された 著者 Sebastian Mach,