clang / g ++与私有继承和使用声明的区别

时间:2015-01-29 20:25:16

标签: c++ inheritance g++ language-lawyer clang++

请考虑以下代码:

#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 ++标准?

1 个答案:

答案 0 :(得分:3)

海湾合作委员会是正确的。 [namespace.udecl] / 17:

  

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