我遇到了一个奇怪的情况,我的派生类能够访问其基类的私有成员,其中涉及模板。
考虑这个例子:
class A
{
template<typename T>
struct a { using type = a; };
};
class B : A
{
template<typename T>
using type = typename a<T>::type;
};
int main(){ }
汇编结果:
mingw64 / mingw-w64-x86_64-clang 3.9.1-3(来自MSYS2)
$ clang++ -Wall test.cpp -o test.exe -std=c++14
mingw64 / mingw-w64-x86_64-gcc 6.3.0-2(来自MSYS2)
$ g++ -Wall test.cpp -o test.exe -std=c++14
两个编译器都会毫无错误地接受!另外,如果您只是将B::type
移动到像B::b::type
这样的内容中,clang突然意识到它不应该访问私有成员,而g ++编译没有问题:
class A
{
template<typename T>
struct a { using type = a; };
};
class B : A
{
template<typename T>
struct b { using type = typename a<T>::type; };
};
int main(){ }
汇编结果
mingw64 / mingw-w64-x86_64-clang 3.9.1-3(来自MSYS2)
$ clang++ -Wall test.cpp -o test.exe -std=c++14
test.cpp:10:39: error: 'a' is a private member of 'A'
struct b { using type = typename a<T>::type; };
^
test.cpp:4:13: note: implicitly declared private here
struct a { using type = a; };
^
1 error generated.
mingw64 / mingw-w64-x86_64-gcc 6.3.0-2(来自MSYS2)
$ g++ -Wall test.cpp -o test.exe -std=c++14
我的问题是,导致这种行为的原因是派生类有时可以访问其基类的成员,有时却没有,这是预期的行为吗?