假设我有一个代码
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文件和源文件之间的使用不一致?
答案 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
会更奇怪 - 也许应该有警告......)