在C ++中合法制作类模板B
的基类规范是否依赖于类A
的私有定义,它是类模板B
的朋友?示例代码:
struct Empty {};
template <typename T>
struct B;
struct A
{
friend struct B<A>;
private:
using Base = Empty;
};
template <typename T>
struct B : T::Base
{
};
int main()
{
B<A> test;
return 0;
}
Godbolt链接:https://godbolt.org/g/HFKaTQ
代码可以使用Clang trunk(和旧版本)和MSVC 19(VS 2017)编译,但无法使用GCC trunk(和旧版本)进行编译:
test.cpp: In instantiation of 'class B<A>':
test.cpp:21:7: required from here
test.cpp:15:8: error: 'using Base = class Empty' is private within this context
struct B : T::Base
^
test.cpp:11:20: note: declared private here
using Base = Empty;
^
哪个编译器错了?
编辑:顺便说一句,如果将B
转换为常规类(删除模板参数),代码将在GCC中编译。所以,我猜它也应该在类模板的情况下工作。另外cppreference说:&#34;朋友本身也可以从这个类的私有和受保护成员继承。 (自C ++ 11起)&#34;