为什么 sub_match 和 basic_string 比较运算符是用额外的字符串副本实现的?

Why did sub_match and basic_string comparsion operator implemented with extra copy of string?

标准 n4713 说 operator== 用于 basic_stringsub_match:

template<class BiIter, class ST, class SA>  
bool operator==( const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs, const sub_match<BiIter>& rhs);

Returns: rhs.compare(typename sub_match::string_type(lhs.data(), lhs.size())) == 0

因此,整个新字符串是从 basic_string lhs 参数创建的(我认为原因可能是不同的分配器类型),但相同的结果可能没有 exta 复制字符串:

rhs.compare(lhs.data()) == 0

我们可以直接为 const value_type* 调用重载,而无需任何额外的复制。 这是对标准的疏忽,还是我遗漏了一些小细节?

您混淆了函数的实现与标准规定的行为方式。它们不是一回事。只要 return 值与按描述实现时的值相同,实现就可以以任何方式实现此功能。

具体来说,the standard states 关于函数规范的 "Returns" 部分:

Returns: a description of the value(s) returned by the function

对比一下:

Effects: the actions performed by the function

Returns是描述性的;效果是规定的。 Returns 描述的是值,而不是它的计算方式。因此,as-if 规则可以适用:任何计算相同值的等效代码都是有效的。