const 字符串仍然更可取吗?

Is a const string Still Preferable?

我在这里问了一个关于迭代器的问题: 因此我开始了解它们提供的一些保护和调试功能。

不过,我相信 begin and end 现在在 C 风格数组上提供了类似的可能性。

如果我想创建一个只在 STL 算法中迭代的 const string,使用 const string 是否仍然有优势,或者我应该更喜欢 const char[] beginend?

所以答案取决于您使用的 c++ 版本

C++98

因为 C++98 没有 std::begin or std::end the best move is just to accept you're going to have to pay the costs of construction and use std::string. If you have boost available you should still consider boost::string_ref 有两个原因。首先,它的构造总是避免分配,总体上比 std::string.

简单得多

boost::string_ref 有效,因为它只存储指向字符串和长度的指针。因此在所有情况下开销都是最小的。

c++11

与 C++98 非常相似,除了使用 boost::string_ref 的建议变得 MUCH 更强大,因为 c++11 有 constexpr 允许编译器通过在编译时构造对象来完全绕过构造。

c++1z

据称(这不是最终版本)图书馆基础 TS 将带给我们 std::string_viewboost::string_refstd::string_view 早期提案的原型,旨在以某种形式将功能引入所有版本的 C++。

关于 C++14 字符串文字

C++14 引入了语法为 "foo"s 的字符串文字,不幸的是这只是为了方便。因为 operator""s 不是 constexpr,所以它不能在编译时求值,因此不能避免构造带来的惩罚。所以它可以用来使代码更漂亮,但在这种情况下它没有提供任何其他好处。