为什么MSVC编译器在没有警告或错误的情况下提供对该私有功能的访问?

Joh*_*air 6 c++ visual-c++

MSVC为什么在没有任何错误或警告的情况下构建它?这段代码中有些含糊吗?GCC编译器返回错误,因为该函数f是私有的。

#include <stdio.h>

class A {
private:
    bool f(void) {return true;};
};

class B : public A {
};

class C : public B {
public:
    using A::f;
};

int main() {
    C c;
    if (c.f()) {
        printf("Access to private function\n");
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

例如,请看这里:https : //godbolt.org/z/I5mUSa

gez*_*eza 3

这是一个 MSVC 错误。[命名空间.udecl]/18

在未命名构造函数的 using 声明符中,引入的声明集的所有成员都应可访问。在命名构造函数的 using 声明符中,不执行访问检查。特别是,如果派生类使用 using 声明符来访问基类的成员,则该成员名称应该是可访问的。如果名称是重载成员函数的名称,则所有指定的函数都应可访问。using 声明符提到的基类成员应在指定 using 声明符的类的至少一个直接基类的范围内可见。

由于A::f中 不可访问C,因此该程序格式错误(位于using A::f),因此编译器应拒绝它。