在成员函数中为继承的成员字段使用声明

using declaration inside a member function for an inherited member field

提问人:francesco 提问时间:1/8/2023 最后编辑:francesco 更新时间:1/9/2023 访问量:181

问:

在函数内部,可以使用 using 声明在当前作用域中导入名称,例如

namespace A {
   int y;
}

void f() { using A::y; }

using 声明可以在类定义中使用,以更改继承成员的可访问性,但显式引入从模板类继承的成员也很有用

template <bool activate>
struct A {
   int x;
};

template <bool activate>
struct B : public A<activate> {
   using A<activate>::x;
};

这特别有用,因为它避免了访问 via 或 .这只能在定义正文中使用,而不能在成员函数中使用。xthis->xA<activate>::x

template <bool activate>
struct A {
   int x;
};

template <bool activate>
struct B : public A<activate> {
   int f() const noexcept {
       // This gives: "error: using-declaration for member at non-class scope"
       // using A<activate>::x;
       return x;
   }
};

对语言的这种限制,也就是说,对于只能放在类的定义中这一事实,是否有理由?using A<activate>::x

C++ 语言律师 使用指令

评论

0赞 Richard Critten 1/8/2023
仅供参考 MSVC 编译此 - 实时 - godbolt.org/z/4d6Txb5M8
0赞 AspectOfTheNoob 1/8/2023
顺便说一句,如果激活是using A<true>::xfalse
2赞 n. m. could be an AI 1/8/2023
@RichardCritten仅在实例化之前。f
0赞 francesco 1/8/2023
@AspectOfTheNoob啊,对不起,我当然是有意的,我修改了问题using A<activate>::x
3赞 Igor Tandetnik 1/8/2023
同时,您可以执行.演示auto& x = A<activate>::x;

答:

2赞 Davis Herring 1/9/2023 #1

《C++的设计与演进》中,如果没有关于这个主题的直接陈述,就很难可靠地推断出这样的事情的意图。也就是说,直到最近,该标准仍将 using-declarations 描述为引入声明作为命名声明的同义词。在这种观点中,让成员声明属于块范围会有点奇怪。现在,它们被认为是在名称查找期间被其引用对象替换的重定向,这将与这种名义用法更加一致。