clang / g++的私有继承和using声明有什么区别?

4
考虑以下代码:

Code:

#include <iostream>

struct Params { };

template <class T>
struct Base
{
    int data() const { return 42; }
};

template <template <class> class D, class P>
struct Middle : private D<P> // must be 'public' for g++
{
};

struct Final : public Middle<Base,Params>
{
    using Base<Params>::data;
};


int main() {

    Final f;

    std::cout << f.data() << std::endl;

    return 0;
}

这段代码在使用clang编译时成功并输出42,但在gcc编译时会出现编译时错误。

'int Base::data() const [with T = Params]' 不可访问

在这种情况下,哪个实现更符合C++标准?


“Final” 在任何情况下都不应该看到“Base”,所以我认为gcc在这里胜出?不过我对自己的答案有些谨慎,因为当涉及到合规性时,我更喜欢clang... - Suedocode
@Aggieboy Final 看到 Base。可访问性 != 可见性。 - Columbo
在Middle类中添加using D<P>::data;后,代码在g++上编译良好:http://coliru.stacked-crooked.com/a/269f221d5a8efab8 - αλεχολυτ
@alexolut 对的,因为现在Middle中的datapublic的,这使得Final可以访问它。 - Barry
1
如果您完全删除模板,clang会产生与g++相同的错误 http://goo.gl/aH8ZyY error: 'Base'是'Base'的私有成员 @UlrichEckhardt - αλεχολυτ
显示剩余2条评论
1个回答

3

GCC是正确的。[namespace.udecl]/17:

继承构造函数的访问规则在12.9中指定;否则,在using-declaration中提到的名称的所有实例都应该是可访问的。 特别地,如果派生类使用using-declaration访问基类的成员,则成员名称应该是可访问的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接