Яка різниця між std::stringта std::basic_string? І навіщо потрібні обидва?
Відповіді:
std::basic_stringє шаблоном класу для створення рядків із типів символів, std::stringє typedefспеціалізацією цього шаблону класу для char. Так, вони обоє потрібні (або принаймні вимагаються стандартом).
std::stringє екземпляром std::basic_string<T>:
typedef std::basic_string<char> string
std::basic_stringнеобхідно мати подібний інтерфейс для всіх типів рядків ( wstringнаприклад).
stringє спеціалізація в basic_string.
namespace std { typedef basic_string<char> string; }Технічно це теж не є екземпляром, але принаймні ближче (інстанціація, за визначенням, створює екземпляр, а typedef лише створює ім'я, а не екземпляр ).
A std::string- це екземпляр std::basic_stringшаблону з типом char. Вам потрібно і те, і інше, щоб ви могли складати ряд речей, крім того char, наприклад, std::basic_string<wchar_t>для рядка широких символів. Або , якщо ви хочете рядок з 32 - бітними елементами std::basic_string<unsigned int>.
std::basic_stringстворили б інстанцію без charтипу.