Почему #include <string>необходимо для строковых объектов, но не для строковых литералов? - PullRequest
2 голосов
/ 10 июня 2019

Почему при использовании строкового объекта для переменных и параметров вам нужно иметь #include <string>, но вам не нужно его для строковых литералов?Например, вы можете сказать cout << "This is a string literal"; без #include <string>.

Я изучаю C ++ с помощью книги Deitel Brothers и задал этот вопрос при изучении массивов символов.

Ответы [ 2 ]

8 голосов
/ 10 июня 2019

Строковый литерал не является объектом std::string, это массив const char.
"This is a string literal" имеет тип const char[25].

В большинстве ситуаций, включая эту,массив неявно превращается в указатель на его первый элемент, и существует operator<< перегрузка для const char*.

Довольно странно, что «строка» означает несколько разных вещей в C ++, но через некоторое время (ивыдергивание волос и скрежет зубов) предполагаемый смысл будет понятен из контекста.

2 голосов
/ 10 июня 2019

Строковый литерал типа "This is a string literal" имеет тип const char[25], а не тип std::string. Оператор cout << "This is a string literal" на самом деле вызывает operator <<(ostream&, const char*), и строковый литерал параметра затухает до типа const char*. В этом случае std::string не задействовано.

...