为什么 std::string 不定义乘法或文字? [关闭]

2024-01-14

在我第一次接触到的语言中,有一个函数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++ 的核心语言和库中,没有任何功能可以加入,除非看起来几乎everyone会同意所提议的功能。它必须是真正通用的。

我可能认为“123”* 3 可以得到“369”——将任何数字乘以 3。我进一步建议这种解释足够“理智”,足以使您的重复运算符解释不再是唯一明确的解释。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 std::string 不定义乘法或文字? [关闭] 的相关文章

随机推荐