考虑下面的代码,并假设几年后;一位同事在DLL中添加了SetRotationSpeed(int i)
的新实现,知道包含隐式转换的类的代码已在静态模式下编译。除了可能会改变程序的行为之外,不会有编译错误,在我看来,这对程序的行为构成了潜在的危险。C++标准是否考虑过这种边缘效应?在本主题中,我对显式关键字的使用并不特别感兴趣,而是对我们可以在由几个开发人员以分离的 DLL 形式开发的程序中遇到的边缘效果感兴趣,这些开发人员不一定知道每个开发人员开发的另一个部分。
#include <iostream>
#include <string>
using namespace std;
class A
{
public:
A(int n)
: m_RotationalScannerSpeed(n/2)
{
std::cout << "Scanner Rotation speed"<< m_RotationalScannerSpeed<<endl;
}
private:
int m_RotationalScannerSpeed;
};
void SetRotationSpeed(A a){
};
// Function added 2 years later by a collegue in a DLL...
/*void SetRotationSpeed(int i){
};*/
int main (int argc, char* argv[])
{
int i=5;
SetRotationSpeed(i);
}
> 通常应该使用explicit
说明符来避免这种情况。当构造函数被标记为explicit
时,不能使用该构造函数进行隐式转换。只允许显式转换,这通常是一件好事。Clang甚至对此有一个很好的警告:
Clang-Tidy:单参数构造函数必须显式标记为 避免无意的隐式转换