C ++隐式转换:良好的规范性或对程序行为的危险?

时间:2019-04-03 13:53:20

标签: c++

考虑下面的代码,并假设在几年之后;一位同事知道知道,包含隐式转换的类的代码已在静态模式下编译,因此在DLL中添加了SetRotationSpeed(int i)的新实现。 除了可能会改变程序行为的编译错误之外,不会有编译错误,我认为这对程序行为构成潜在的危险。 C ++标准是否考虑了这种边缘效应? 在本主题中,我对 explicit 关键字的使用并不特别感兴趣,但是在一些未必知道的开发人员以分离的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);
}

1 个答案:

答案 0 :(得分:4)

通常应使用explicit说明符来避免这种情况。将构造函数标记为explicit时,不能使用该构造函数进行隐式转换。只允许显式转换,这通常是一件好事。 Clang甚至对此有一个很好的警告:

  

Clang-Tidy:必须将单参数构造函数标记为显式   避免意外的隐式转换