std :: stringとstd :: basic_stringの違いは何ですか?そして、なぜ両方が必要なのですか?


94

違いは何だstd::stringとはstd::basic_string?そして、なぜ両方が必要なのですか?

回答:


63

std::basic_stringは文字タイプから文字列を作成するためのクラステンプレートであり、std::stringtypedefそのクラステンプレートを特殊化するためのものcharです。はい、両方とも必要です(または少なくとも標準で必要です)。


17
なぜ両方が必要なのですか?
Mohamed El-Nakib 2014

1
つまり、std :: stringはtypedefstd :: basic_string <char> std :: stringですか?
unresolved_external

1
@MuhammadAnnaqeebは2。5年遅れていますが、簡単な答えは、ワイド文字列(wstring)(Unicode、1文字あたり2バイト、wchar_t)のサポートも提供することです。
アンドリュー

46

std::stringのインスタンス化ですstd::basic_string<T>

typedef std::basic_string<char> string

std::basic_stringすべてのタイプの文字列(wstringたとえば)に対して同様のインターフェースを持つ必要があります。


33
適切な用語は「専門化」です。string専門ですbasic_string
AnT 2009年

3
私はあなたがそれについて議論することができると思います。「特殊化」は通常、継承を示すために使用されます。テンプレート化された{class | function}は、テンプレート引数を代入することによってインスタンス化されます。部分的なテンプレートの特殊化がありますが、これはここでは使用されません。
pmr 2009年

5
派生クラスを「特殊化」と呼ぶことは、「特殊化」のあまり正式な使用法ではありません。「特殊化」という言葉は、標準ではこのようにまったく使用されていませんが(私はかなり確信しています)、テンプレートの特殊化を説明するために広く使用されています。テンプレートの特殊化の名前は、強制的および暗黙的なインスタンス化を行わないコンテキストで使用できるため、特殊化とインスタンス化は別個の概念です。テンプレートの特殊化(特定のパラメーターのセットを持つテンプレートの名前)だけでなく、部分的な特殊化(クラステンプレートのみ)と明示的な特殊化もあります。
CBベイリー

1
ここで「特殊化」を使用すると、誤解を招く可能性があります。テンプレートの特殊化には特定の意味があります(継承とは関係ありません)が、ここで使用されているのはそれではありません。std :: stringは、次のようにtypedefにすぎません。namespace std { typedef basic_string<char> string; }技術的には、実際にはインスタンス化でもありませんが、少なくとも近いです(インスタンス化は、定義上、インスタンスを作成し、typedefは名前のみを作成し、インスタンスは作成しません) )。
ジェリーコフィン

3
@Charles:誤解を招く可能性があります。これは、(テンプレートを使用した場合)「特殊化」は通常、部分的な特殊化または明示的な特殊化のいずれかを指し、単純なインスタンス化として終わるもののtypedefではないためです。
ジェリーコフィン

17

Astd::stringは、std::basic_stringタイプがchar。のテンプレートのインスタンス化です。ワイド文字の文字列charなど、以外の文字列を作成できるようにするには、両方が必要ですstd::basic_string<wchar_t>。または、32ビット要素の文字列が必要な場合は、std::basic_string<unsigned int>


2
私はこれがトップ投票の答えであるべきだと思います。タイプstd::basic_stringなしでインスタンス化しない場合のユースケースを提供しますchar
hlin117
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.