如何在不一致地使用const时使编译器至少给出警告

时间:2016-03-09 19:08:10

标签: c++ const compiler-warnings

假设我有一个代码

Test.h

class Test{
 public:
  int Func(const int a);
};

Test.cpp的

int Test::Func(const int a){
  // some code
}

如果我为其中一个取出const,编译器仍会编译并发出零警告。即使在GCC中启用-Wall和-Wextra并且在Visual Studio中启用了/ W4。

例如Test.h

class Test{
 public:
  int Func(int a);
};

Test.cpp的

int Test::Func(const int a){
  // some code
}

或Test.h

class Test{
 public:
  int Func(const int a);
};

Test.cpp编译都很好。

int Test::Func(int a){
  // some code
}

如何让编译器检测何时const文件和源文件之间的使用不一致?

2 个答案:

答案 0 :(得分:3)

那些声明和定义都是一样的!在将声明与定义匹配时,将忽略顶级const。所以这个组合没问题:

class C {
    void f(int);
};

void C::f(const int) {
}

因为const不算数,松散地说。类似地,

class C {
    void f(int) {
    }
    void f(const int) {
    }
};

是一个错误,因为它定义了两次相同的函数。

答案 1 :(得分:1)

根据标准([dcl.fct] / 5)

  

函数的所有声明都应在返回类型和参数中完全一致 -   键入列表。 ......之后   确定每个参数的类型,“T数组”或“函数返回T”的任何参数都是   调整为“指向T的指针”或“指向函数返回T的指针”。生成列表后   参数类型,修改参数类型的任何顶级 cv-qualifiers 在形成时将被删除   功能类型。生成的已转换参数类型列表以及省略号的存在与否   或函数参数包是函数的参数类型列表。

所以两个声明(注意:定义是一个声明)即使有一个const int a而另一个有int a也可以同意:匹配声明时会忽略顶级const

但是,顶级const在定义中很重要。如果参数为const int a,则函数体无法修改a。实际上,在标题中省略const并将其包含在定义中是有道理的,因为调用者不需要知道通过值传递的参数未被修改(它是实现细节)。这可能是没有警告的原因。 (在标题中有const并且定义中没有const会更奇怪 - 也许应该有警告......)