提问人:francesco 提问时间:1/8/2023 最后编辑:francesco 更新时间:1/9/2023 访问量:181
在成员函数中为继承的成员字段使用声明
using declaration inside a member function for an inherited member field
问:
在函数内部,可以使用 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 或 .这只能在定义正文中使用,而不能在成员函数中使用。x
this->x
A<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
答:
2赞
Davis Herring
1/9/2023
#1
在《C++的设计与演进》中,如果没有关于这个主题的直接陈述,就很难可靠地推断出这样的事情的意图。也就是说,直到最近,该标准仍将 using-declarations 描述为引入声明作为命名声明的同义词。在这种观点中,让成员声明属于块范围会有点奇怪。现在,它们被认为是在名称查找期间被其引用对象替换的重定向,这将与这种名义用法更加一致。
评论
using A<true>::x
false
f
using A<activate>::x
auto& x = A<activate>::x;