最终说明符对单独的声明和定义没有影响

final specifier has no effect with separate declaration and definition

我注意到 final 关键字有一些奇怪的行为。当我这样做时:

class A {
public:
    virtual ~A() = default;
    virtual void foo() final {}
};

class B : public A {
public:
    void foo() override {}
};

如我所料,在 B 中重写 foo 时出现编译器错误。但是当我单独定义和声明 A::foo

class A {
public:
    virtual ~A() = default;
    virtual void foo() final;
};

void A::foo() {}

class B : public A {
public:
    void foo() override {}
};

错误消失了。是应该的还是编译器错误?

//编辑:gcc 版本 4.9.2 (Debian 4.9.2-10+deb8u1)

这两个代码段都应生成有关覆盖 final 函数的编译器错误。这似乎是一个编译器错误。 gcc 4.9.2 compiles and gcc 4.9.3 生成错误。