STL generic algorithms - implicit conversion of the ranges element type to the predicates parameter type

Say I want to remove all punctuation characters within a std::string using the erase-remove idiom.

However, let str be of type std::string, this call won't compile

str.erase( std::remove_if(str.begin(), str.end(), std::ispunct), str.end() );

Now I guess, strictly speaking the std::ispunct callables parameter type is int and therefore doesn't match the ranges element type char. However, as a char is a numeric type it should be convertible to int. I'm working with Lippman's C++ Primer book which states

The algorithms that take predicates call the predicate on the elements in the input range. [...] it must be possible to convert the element type to the parameter type in the input range.

which imo is given in the above statement. Also std::ispunct returns an int, and thus should be usable as a condition.

So why does the compiler complain no matching function for call to 'remove_if'? (clang++ -std=c++11 -o main main.cc)

A fix would be to use a lambda

str.erase( std::remove_if(str.begin(), str.end(),
                          [] ( char ch ) { return std::ispunct(ch); }),
            str.end() );

still it suprised me that a lambda is necessary...

Thanks in advance!



from Recent Questions - Stack Overflow https://ift.tt/3ie8YZo
https://ift.tt/eA8V8J

Comments

Popular posts from this blog

Today Walkin 14th-Sept

Spring Elasticsearch Operations

Hibernate Search - Elasticsearch with JSON manipulation