title: Explicit bool operator - cannot return, test, initialize bool
body: <p>I just tried to use <code>explicit operator bool()</code> for the first time and its behavior is quite unexpected to me. Can someone please shed some light on why the following sections marked with <code>// does  not work</code>.</p>
  
  <p>The <code>convertible</code> class would e.g. be a smart pointer class with the ability to check for the validity of the contained data.</p>
  
  <pre><code>struct convertible
  {
    explicit operator bool() const
    {
      return ptr;
    }
  
    void* ptr = nullptr;
  };
  
  bool testReturn()
  {
    convertible test;
    // does not work
    return test;
  }
  
  bool testReturn2()
  {
    convertible test;
    // does not work
    return test == true;
  }
  
  bool testReturn3()
  {
    convertible test;
    // works ?!
    return !test;
  }
  
  int main()
  {
    convertible test;
    // works
    if (test) { }
    // works
    bool init(test);
    bool tested = test;
    bool tested2 = testReturn();
    bool tested3 = testReturn2();
    bool tested4 = testReturn3();
    return 0;
  }
  </code></pre>
  
  <p>With GCC I get:</p>
  
  <pre><code>milian@minime:/tmp$ g++ --version
  g++ (GCC) 4.8.2 20131219 (prerelease)
  Copyright (C) 2013 Free Software Foundation, Inc.
  This is free software; see the source for copying conditions.  There is NO
  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  
  milian@minime:/tmp$ g++ -std=c++11 test.cpp 
  test.cpp: In function ‘bool testReturn()’:
  test.cpp:15:10: error: cannot convert ‘convertible’ to ‘bool’ in return
    return test;
            ^
  test.cpp: In function ‘bool testReturn2()’:
  test.cpp:22:15: error: no match for ‘operator==’ (operand types are ‘convertible’ and ‘bool’)
    return test == true;
                ^
  test.cpp:22:15: note: candidate is:
  test.cpp:22:15: note: operator==(int, int) &lt;built-in&gt;
  test.cpp:22:15: note:   no known conversion for argument 1 from ‘convertible’ to ‘int’
  test.cpp: In function ‘int main()’:
  test.cpp:39:17: error: cannot convert ‘convertible’ to ‘bool’ in initialization
    bool tested = test;
  </code></pre>
  
  <p>With Clang it's similar:</p>
  
  <pre><code>milian@minime:/tmp$ clang++ --version
  clang version 3.4 (tags/RELEASE_34/final)
  Target: x86_64-unknown-linux-gnu
  Thread model: posix
  milian@minime:/tmp$ clang++ -std=c++11 test.cpp 
  test.cpp:15:10: error: no viable conversion from 'convertible' to 'bool'
    return test;
          ^~~~
  test.cpp:22:15: error: invalid operands to binary expression ('convertible' and 'int')
    return test == true;
          ~~~~ ^  ~~~~
  test.cpp:39:8: error: no viable conversion from 'convertible' to 'bool'
    bool tested = test;
        ^        ~~~~
  3 errors generated.
  </code></pre>