当方法覆盖并省略 const 时,gcc 编译器不显示警告
gcc compiler not show warning when method override and omit const
为什么编译时没有警告?
struct A{
virtual void get(int const x) = 0;
};
struct B : public A{
virtual void get(int x) override{
}
};
int main(int argc, char *argv[]){
B b;
b.get(6);
return 0;
}
这是输出:
g++ -std=c++11 -Wall ./x.cc
clang -std=c++11 -Wall ./x.cc -lstdc++
如果我添加 -Wextra
我会收到有关未使用函数参数的消息,但仍然没有关于常量的信息。
方法签名完全一致,所以代码没有问题。如果它们不匹配,您会收到错误,而不是警告。
为什么签名是一样的?因为顶级 const
s 被忽略 1。这三个是重复声明:
void foo(const int); // declaration of foo(int)
void foo(int const); // re-declaration of foo(int)
void foo(int); // re-declaration of foo(int)
最好从函数声明中省略顶层 const
,因为它们充其量只会造成混淆。您 可以 在函数定义中使用 const
作为实现细节,就像您可以在不需要时声明任何局部变量 const
一样待修改。
void foo(const int n)
{
// n is const here. I know that is shouldn't be changed so I enforce it.
}
1 另见:What are top-level const
qualifiers?
为什么编译时没有警告?
struct A{
virtual void get(int const x) = 0;
};
struct B : public A{
virtual void get(int x) override{
}
};
int main(int argc, char *argv[]){
B b;
b.get(6);
return 0;
}
这是输出:
g++ -std=c++11 -Wall ./x.cc
clang -std=c++11 -Wall ./x.cc -lstdc++
如果我添加 -Wextra
我会收到有关未使用函数参数的消息,但仍然没有关于常量的信息。
方法签名完全一致,所以代码没有问题。如果它们不匹配,您会收到错误,而不是警告。
为什么签名是一样的?因为顶级 const
s 被忽略 1。这三个是重复声明:
void foo(const int); // declaration of foo(int)
void foo(int const); // re-declaration of foo(int)
void foo(int); // re-declaration of foo(int)
最好从函数声明中省略顶层 const
,因为它们充其量只会造成混淆。您 可以 在函数定义中使用 const
作为实现细节,就像您可以在不需要时声明任何局部变量 const
一样待修改。
void foo(const int n)
{
// n is const here. I know that is shouldn't be changed so I enforce it.
}
1 另见:What are top-level const
qualifiers?