为什么 sub_match 和 basic_string 比较运算符是用额外的字符串副本实现的?
Why did sub_match and basic_string comparsion operator implemented with extra copy of string?
标准 n4713 说 operator==
用于 basic_string
和 sub_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 规则可以适用:任何计算相同值的等效代码都是有效的。
标准 n4713 说 operator==
用于 basic_string
和 sub_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 规则可以适用:任何计算相同值的等效代码都是有效的。