13

時間の経過とともに、STL* のさまざまな代替実装 (STLPort など) が登場しました。特定の大企業も、さまざまな目的で STL の独自の内部ポートを使用しています。

C++03 では、移植可能な C++ 言語機能のみを使用して STL の移植版を作成することができます。つまり、適合するコンパイラはそれをコンパイルできるはずです。

しかし、C++11 では、コンパイラのサポートが必要な特定の機能はありませんか?

たとえば、std::is_standard_layoutC++ 言語機能だけを使用して実装する方法がわかりません。ベースポインタと派生ポインタを使用してstd::is_base_of、の観点から実装できると思います。しかし、どのように実装std::is_convertibleできるか想像できません。std::is_standard_layout私には思い浮かばなかった他の機能もあるかもしれません。

それで、私はここで正しいですか?C++ 言語機能のみを使用して C++11 で標準ライブラリの完全なポートを作成することは不可能ですか?

*STL と「C++ 標準ライブラリ」は厳密には互換性がないことは知っていますが、この場合は明らかに C++ 標準ライブラリを意味します。

4

1 に答える 1

19

C++ のどのバージョンでも、完全に移植可能な標準 C++ ライブラリの実装を作成することはできません! まず、一部の標準 C++ ライブラリ コンポーネントは、システムの仕様を明確に抽象化しています。たとえば、ファイル ストリームは、ファイル アクセスへのアクセスを抽象化します。はい、内部で使用できますがFILE*、標準 C ライブラリは標準 C++ ライブラリの一部であり、移植可能な実装にはその部分も含める必要があると考えています。また、特定の型は実際にはコンパイラに依存しています。たとえば、言語レベルの相互作用があるためです。たとえばstd::bad_cast、 の結果としてスローされdynamic_cast<...>()ます。また、一部の標準 C++ ライブラリ コンポーネントでは、メモリ レイアウトに関する既知の情報を利用する必要があります。reinterpret_cast<...>()正しいことをします。その他の場合、標準ライブラリは、移植可能であると判断できない値を指定します。たとえば、 のフィールドの一部ですstd::numeric_limits<T>

標準 C++ ライブラリの全体的な考え方は、一般的なニーズをカバーし、移植可能かつ効率的に実装できない特定の機能を実装することです。あなたが引用した型特性は、コンパイラが何らかの助けを提供する必要がある例のほんの一部です。型特性がコンパイラによってどのように公開されるかについてある程度の合意を得ようとしましたが、コンパイラの作成者は、自由に選択する必要があり、標準 C++ ライブラリは特性が公開される方法に共通のインターフェイスを提供する必要があると主張しました。 .

于 2013-09-20T18:28:40.630 に答える