57 lines
1.1 KiB
ReStructuredText
57 lines
1.1 KiB
ReStructuredText
|
.. title:: clang-tidy - google-explicit-constructor
|
||
|
|
||
|
google-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;
|
||
|
...
|
||
|
|
||
|
|
||
|
|
||
|
See https://google.github.io/styleguide/cppguide.html#Explicit_Constructors
|