派生类能够访问其基类的私有成员

时间:2017-03-16 16:40:58

标签: c++ c++14 metaprogramming

我遇到了一个奇怪的情况,我的派生类能够访问其基类的私有成员,其中涉及模板。

考虑这个例子:

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

我的问题是,导致这种行为的原因是派生类有时可以访问其基类的成员,有时却没有,这是预期的行为吗?

1 个答案:

答案 0 :(得分:9)

  

我的问题是,导致这种行为的原因是派生类有时可以访问其基类的成员,有时却没有,这是预期的行为吗?

编译器错误。有一堆gcc bugs与模板中的访问控制相关,这个可能是#41437专门解决的问题。 clang别名模板错误是#15914