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

标签 c++ string c++11 multiplication user-defined-literals

<分区>

在我最初接触的语言中,有一个函数 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 是标准库的一部分,它是语言语法本身之上的抽象级别。换句话说,文字表示法会破坏将“语言功能”和“您可以期望与编译器捆绑在一起的库”分开的抽象级别。

关于c++ - 为什么 std::string 不定义乘法或文字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10591262/

相关文章:

c++ - std::unordered_map<std::string,std::function<void(std::string&) 是否只能容纳静态函数?

c++ - 段错误 - 为什么以及如何工作?

c++ - 如何让程序在启动时运行?

c - printf 上附加了奇怪的字符串

c++ - 如何使用 C++11 正则表达式将字符串与通配符匹配

c++ - 如何 "enable"基于模板参数的函数?

c++ - 获取计算机名和登录用户名

c++ - 条件变量通知后的执行顺序

C++ 新手 : my loop should CHANGE a string, 然后将字符串打印到文件中。但它正在添加到字符串中

java - 从 ArrayList<HashMap<String, String>>> 获取键到另一个数组