为什么字符串对象需要 #include <string> 而不是字符串文字?

Why is #include <string> needed for string objects but not string literals?

为什么在将字符串对象用于变量和参数时需要 #include <string>,但对于字符串文字却不需要它?例如,您可以说 cout << "This is a string literal"; 而不是 #include <string>

我正在使用 Deitel Brothers 的书学习 C++,在学习字符数组时想到了这个问题。

字符串文字不是 std::string 对象,它是 const char.
的数组 "This is a string literal" 的类型为 const char[25].

在大多数情况下——包括这个——数组隐式地退化为指向其第一个元素的指针,并且 const char* 有一个 operator<< 重载。

"string" 在 C++ 中有几种不同的含义,这很令人困惑,但过了一段时间(扯头发和咬牙切齿),预期的含义将从上下文中清楚。

"This is a string literal" 这样的字符串文字是 const char[25] 类型,而不是 std::string 类型。语句cout << "This is a string literal"实际上调用了operator <<(ostream&, const char*),字符串字面量参数衰减为类型const char*。本案中不涉及任何 std::string