当方法覆盖并省略 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 我会收到有关未使用函数参数的消息,但仍然没有关于常量的信息。

方法签名完全一致,所以代码没有问题。如果它们不匹配,您会收到错误,而不是警告。

为什么签名是一样的?因为顶级 consts 被忽略 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?