C++ 隐式转换:良好的特异性或对程序行为的危险

  • 本文关键字:程序 危险 特异性 C++ 转换 c++
  • 更新时间 :
  • 英文 :


考虑下面的代码,并假设几年后;一位同事在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:单参数构造函数必须显式标记为 避免无意的隐式转换

相关内容

最新更新