.. title:: clang-tidy - misc-explicit-constructor

misc-explicit-constructor
=========================

Checks that constructors callable with a single argument and conversion
operators are marked explicit to avoid the risk of unintentional implicit
conversions.

Consider this example:

.. code-block:: c++

  struct S {
    int x;
    operator bool() const { return true; }
  };

  bool f() {
    S a{1};
    S b{2};
    return a == b;
  }

The function will return ``true``, since the objects are implicitly converted
to ``bool`` before comparison, which is unlikely to be the intent.

The check will suggest inserting ``explicit`` before the constructor or
conversion operator declaration. However, copy and move constructors should not
be explicit, as well as constructors taking a single ``initializer_list``
argument.

This code:

.. code-block:: c++

  struct S {
    S(int a);
    explicit S(const S&);
    operator bool() const;
    ...

will become

.. code-block:: c++

  struct S {
    explicit S(int a);
    S(const S&);
    explicit operator bool() const;
    ...
