using声明是否可以将一个不可访问基类中的公有成员引入到当前作用域?
请考虑
namespace mylib {
struct A {
int member1;
typedef int member2;
};
struct B : private A {};
struct C : B {
using mylib::A::member1;
using mylib::A::member2;
};
}
这里的间接基类 A 在 C 的作用域中不可访问,但其成员仍然可以通过限定名 mylib::A::member 来命名。
这样的限定名可以出现在一个 using-declaration 中,将该成员重新公开吗?
Clang和 EDG接受上述代码片段,而GCC和 MSVC拒绝。
解决方案
根据 namespace.udecl#14,该程序是不合法的:
在一个没有为构造函数命名的 using-declarator 中,所命名的每个声明都必须是可访问的。
在一个命名了构造函数的 using-declarator 中,不执行访问检查。
并且因为给定的using-declarator并未命名构造函数,且该成员不可访问(因为 A 是私有基类),Clang和 EDG不发出诊断才是错误的。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。