为什么 std::string 不定义乘法或文字?

Why doesn't std::string define multiplication or literals?

本文关键字:文字 定义 std string 为什么      更新时间:2023-10-16

在我第一次被介绍的语言中,有一个函数repeat(),它需要一个字符串,并重复了n次。例如,repeat ("hi", 3)给出的结果为 "hihihi" .

确实使用过很多次这个功能,但令我沮丧的是,我从未在C++中找到类似的东西。是的,我可以轻松地制作自己的,或者使其更易于使用,但我很惊讶它还没有包含在内。

它非常适合的一个地方是std::string

std::string operator* (const std::string &text, int repeatCount);
std::string operator* (int repeatCount, const std::string &text);

这将允许以下语法:

cout << "Repeating "Hi" three times gives us "" << std::string("Hi") * 3 << ""."

现在这本身还不是太好,但它可能会更好,这让我想到了我的另一部分:文字。

每当我们使用字符串运算符时,例如 operator+ ,我们必须确保一个参数实际上是一个字符串。他们为什么不像""s一样为它定义一个文字?不以下划线开头的文字后缀是为实现保留的,因此这不应该冲突,因为在任何人真正开始制作自己的后缀之前如何添加它。

回到重复示例,语法将简单地为:

cout << "123"s * 3 + "456"s;

这将产生:

123123123456

同时,还可以包括一个字符,以满足cout << '1's + '2's;

为什么不包括这两个功能?它们肯定有明确的含义,并使编码更容易,同时仍然使用标准库。

好吧,至于乘法,它并不真正符合C++的哲学:像Ruby这样的语言"包括电池"和"最小惊喜原则"。它们旨在将许多这些小细节作为超越最低限度的功能。C++是一种系统级语言,旨在"更接近金属",这一点非常清楚,因为string甚至不是该语言的核心数据类型,而是库提供的插件。甚至 FORTRAN 也具有原生字符串类型,因此您可以看到低级C++的位置。这是有意为之的:如果您正在编写具有 1K 存储的嵌入式芯片并且不使用字符串怎么办?只是不要包括它们。

无论如何,并不是 100% 清楚乘法运算符应该做什么。换句话说,在C++的核心语言和库中,除非看起来几乎每个人都同意提议的功能,否则没有功能进入。它必须是真正普遍的。

我可能会认为"123"* 3可以给出"369" - 将任何数字乘以 3。我进一步提出,这种解释是"理智的",足以防止你的重复运算符解释成为唯一明确的解释。

文字符号更容易回答,也更清晰:std::string是标准库的一部分,标准库是语言语法本身之上的一个抽象级别。换句话说,文字符号将突破分隔"语言功能"和"您可以期望与编译器捆绑在一起的库"的抽象级别。

std::string.append(numtimes, char to repeat(;那里。确实如此。现在,这适用于字符文字,至于使用字符串执行此操作,则无法以声明方式执行此操作。另外需要注意的是,std::string 类不是一种语言类型,c++ 中的字符串 illal 是 const char *。一个指针。哪些数组衰减为指针,这就是 std::string 类处理它所包含的内容的方式,即字符数组,即字符,或 std::wstring 的wchar_t。这些类型有模板。