我只是在考虑std::string::substr
. 它返回一个新std::string
对象,这对我来说似乎有点浪费。为什么不返回一个引用原始字符串内容并且可以隐式分配给 a 的对象std::string
?一种对实际抄袭的懒惰评价。这样的类可能看起来像这样:
template <class Ch, class Tr, class A>
class string_ref {
public:
// not important yet, but *looks* like basic_string's for the most part
private:
const basic_string<Ch, Tr, A> &s_;
const size_type pos_;
const size_type len_;
};
此类的公共接口将模仿 real 的所有只读操作std::string
,因此使用将是无缝的。std::string
然后可以有一个新的构造函数,它采用 astring_ref
所以用户永远不会更聪明。当您尝试“存储”结果时,您最终会创建一个副本,因此引用指向数据然后对其进行修改没有真正的问题。
这个想法是这样的代码:
std::string s1 = "hello world";
std::string s2 = "world";
if(s1.substr(6) == s2) {
std::cout << "match!" << std::endl;
}
std::string
总共构造的对象不超过 2个。对于执行大量字符串操作的代码,这似乎是一个有用的优化。当然,这不仅适用于std::string
,还适用于任何可以返回其内容子集的类型。
据我所知,没有实现这样做。
我想问题的核心是:
给定一个可以根据需要隐式转换为 a 的类,std::string
它是否符合库编写者将成员的原型更改为返回类型的标准?或者更一般地说,库编写者是否有余地在这些类型的情况下返回“代理对象”而不是常规对象作为优化?
我的直觉是这是不允许的,原型必须完全匹配。鉴于您不能仅对返回类型进行重载,那么库编写者将没有空间利用这些类型的情况。就像我说的,我认为答案是否定的,但我想我会问:-)。