Make operator bool() explicit

This prevents unwanted conversions to bool or int such as:
```
py::object my_object;

std::cout << my_object << std::endl; // compiles and prints 0 or 1
int n = my_object; // compiles and is nonsense
```

With `explicit operator bool()` the above cases become compiler errors.
This commit is contained in:
Dean Moldovan 2016-10-17 01:48:32 +02:00
parent 135fd14928
commit c889ebd0e1

View File

@ -88,7 +88,7 @@ public:
const handle& dec_ref() const { Py_XDECREF(m_ptr); return *this; }
template <typename T> T cast() const;
operator bool() const { return m_ptr != nullptr; }
explicit operator bool() const { return m_ptr != nullptr; }
bool operator==(const handle &h) const { return m_ptr == h.m_ptr; }
bool operator!=(const handle &h) const { return m_ptr != h.m_ptr; }
bool check() const { return m_ptr != nullptr; }
@ -572,7 +572,7 @@ public:
class bool_ : public object {
public:
PYBIND11_OBJECT_DEFAULT(bool_, object, PyBool_Check)
// Allow implicit conversion from `bool`:
// Allow implicit conversion from and to `bool`:
bool_(bool value) : object(value ? Py_True : Py_False, true) { }
operator bool() const { return m_ptr && PyLong_AsLong(m_ptr) != 0; }
};