using声明是否可以将一个不可访问基类中的公有成员引入到当前作用域?

编程语言 2026-07-09

请考虑

namespace mylib {
struct A {
    int member1;
    typedef int member2;
};

struct B : private A {};

struct C : B {
    using mylib::A::member1;
    using mylib::A::member2;
};
}

这里的间接基类 AC 的作用域中不可访问,但其成员仍然可以通过限定名 mylib::A::member 来命名。

这样的限定名可以出现在一个 using-declaration 中,将该成员重新公开吗?

Clang和 EDG接受上述代码片段,而GCC和 MSVC拒绝。

解决方案

根据 namespace.udecl#14,该程序是不合法的:

在一个没有为构造函数命名的 using-declarator 中,所命名的每个声明都必须是可访问的。
在一个命名了构造函数的 using-declarator 中,不执行访问检查。

并且因为给定的using-declarator并未命名构造函数,且该成员不可访问(因为 A 是私有基类),Clang和 EDG不发出诊断才是错误的。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章