Reputation: 3072
The following code snippet returns always true on my compiler(visual studio). But is this behavior well defined and portable?
bool return_always_true(std::string const& str)
{
return str.find("") != std::string::npos;
}
int main(){
cout << boolapha << return_always_true("") << endl
<< return_always_true("oxylottl") << endl
<< return_always_true("lorem ipsum") << endl;
//true true true
}
Upvotes: 4
Views: 188
Reputation: 36503
According to Cppreference:
- an empty substring is found at pos if and only if pos <= size()
str.find("")
uses the third overload for std::basic_string::find
which has a signature of :
size_type find( const CharT* s, size_type pos = 0 ) const;
Which means that pos
starts at 0
so pos <= size()
is always true.
Yes, the behaviour is well defined and portable.
Upvotes: 3
Reputation: 29017
I find cppreference.com easier to read than the standard. Quoting them:
Finds the first substring equal to
str
...Formally, a substring
str
is said to be found at positionxpos
if all of the following is true:
xpos >= pos
xpos + str.size() <= size()
- for all positions
n
instr
,Traits::eq(at(xpos+n), str.at(n))
An empty string will always match at the start of the target string because
str
so the match condition is vacuously true.Upvotes: 8
Reputation: 1191
Yes it is: "an empty substring is found at pos if and only if pos <= size()"
Upvotes: 3