请考虑以下代码:
#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 ++标准?
答案 0 :(得分:3)
海湾合作委员会是正确的。 [namespace.udecl] / 17:
继承构造函数的访问规则在12.9中指定; 否则 using-declaration 中提到的所有名称实例 应该是可访问的。 特别是,如果派生类使用了 using-declaration 用于访问基类的成员,即成员名称 应该是可以访问的。