ISO/ IEC JTC1/SC22/WG21 N3509

Doc. no.: N3509
Date:     2013-01-10
Reply to: Olaf van der Spek <olafvdspek@gmail.com>
Title:    Operator Bool for Ranges


I. Introduction

This proposal adds explicit operator bool() to strings, containers and ranges.


II. Motivation and Scope

Bools can be true or false, integers can be zero or non-zero, (smart) pointers can be null or non-null and strings, containers and ranges can be empty or non-empty.
These states are being checked frequently, but only bools, integers and pointers can be checked directly. Strings, containers and ranges can't. Boost iterator_range can, though, which is very handy.
This proposal makes possible such direct checking by adding explicit operator bool() to all standard C++ strings, containers and ranges.

Direct checking is less verbose than using !empty() and allows code like the following where a definition is used inside a condition.

std::string f() { return "Olaf"; }

int main()
{
  if (std::string s = f())
    use(s);

  while (std::string s = f())
    use(s);

  // ugly, no type deduction possible
  for (std::string s; !(s = f()).empty(); )
    use(s);
}


III. Impact on the Standard

This is a pure extension and can be implemented using C++11 compilers and libraries.


IV. Technical Specifications

Add this function to all standard C++ strings, containers and ranges.

explicit operator bool() const { return !empty(); }


V. References

http://www.boost.org/doc/libs/1_52_0/libs/range/doc/html/range/reference/utilities/iterator_range.html˙