C++ 使用 cppcheck 建议的显式

DDS*_*DDS 2 c++ explicit explicit-constructor cppcheck

使用强制转换构造函数不好吗?否则为什么代码质量检查器(在我的例子中是 cppcheck)会不断建议在单参数构造函数之前添加显式?

如果我想做怎么办

class MyClass {  
 A(int) {}
};

A a = 1;
Run Code Online (Sandbox Code Playgroud)

如果我按照“建议”写

class MyClass {  
 explicit A(int) {}
};

A a = 1; 
Run Code Online (Sandbox Code Playgroud)

会抛出一个错误,但如果我使用第一个,我会收到一个警告,我必须记录以通过代码审查。

bol*_*lov 5

C++ 核心指南

C.46 : 默认情况下,显式声明单参数构造函数

原因

避免意外转换。

例子,坏

class String {
public:
    String(int);   // BAD
    // ...
};

String s = 10;   // surprise: string of size 10
Run Code Online (Sandbox Code Playgroud)

例外

如果你真的想要从构造函数参数类型到类类型的隐式转换,不要使用显式:

class Complex {
public:
    Complex(double d);   // OK: we want a conversion from d to {d, 0}
    // ...
};

Complex z = 10.7;   // unsurprising conversion
Run Code Online (Sandbox Code Playgroud)

另见:隐式转换的讨论


Pet*_*ter 5

这种隐式类类型转换可以很容易地在无意中使用。使用此转换构造函数,每个接受MyClass作为参数的函数或成员函数也将接受int。因此,传递给此类函数的每个int参数都将转换为临时值MyClass,该临时值将在函数完成后被丢弃。可能不是你想要的。