C++ 使用 cppcheck 建议的显式

问题描述

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

如果我想做怎么办

class MyClass {  
 A(int) {}
};

A a = 1;

如果我按照“建议”写

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

A a = 1; 

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

解决方法

C++ Core Guidelines

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

原因

为了避免意外的转换。

例子,不好

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

String s = 10;   // surprise: string of size 10

例外

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

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

Complex z = 10.7;   // unsurprising conversion

另见:Discussion of implicit conversions

,

这种隐式的类类型转换可以在无意中轻松使用。使用此转换构造函数,每个接受 MyClass 作为参数的函数或成员函数也将接受 int。因此,传递给此类函数的每个 int 都将转换为临时 MyClass,该临时 // Project Model users: [ { type: mongooseClient.Schema.Types.ObjectId,ref: 'Users' } ] 在函数完成后将被丢弃。可能不是你想要的。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...