简体   繁体   中英

c++: Is the behavior of string::find for empty input string well defined

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
}

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 position xpos if all of the following is true:

  1. xpos >= pos
  2. xpos + str.size() <= size()
  3. for all positions n in str , Traits::eq(at(xpos+n), str.at(n))

An empty string will always match at the start of the target string because

  1. 0 >= 0
  2. 0+0 <= size()
  3. There are no position is str so the match condition is vacuously true.

是的,它是:“当且仅当pos <= size()”时才在pos处找到一个空子串

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM