【问题标题】:using declaration inside a member function for an inherited member field在继承的成员字段的成员函数内使用声明
【发布时间】:2023-01-09 11:24:24
【问题描述】:

在函数内部,可以使用 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;
};

这特别有用,因为它避免了通过this-&gt;xA&lt;activate&gt;::x访问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&lt;activate&gt;::x 只能放在类的定义中?

【问题讨论】:

  • fyi MSVC 编译这个 - 现场 - godbolt.org/z/4d6Txb5M8
  • 顺便说一句,如果激活是 falseusing A&lt;true&gt;::x 将不起作用
  • @RichardCritten 直到你实例化f
  • @AspectOfTheNoob 啊,对不起,我当然打算using A&lt;activate&gt;::x,我修改了问题
  • 同时,你可以auto&amp; x = A&lt;activate&gt;::x;Demo

标签: c++ language-lawyer using-directives


【解决方案1】:

没有关于主题的直接声明C++的设计与演进,很难可靠地推断出这样的事情的意图。也就是说,直到recently,标准描述使用声明作为介绍声明作为命名声明的同义词。从这个角度来看,让成员声明属于块作用域有点奇怪。现在他们被认为是重定向在名称查找期间被它们的引用对象替换,这将更符合这种概念用法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 2013-05-09
    • 2016-06-24
    • 1970-01-01
    • 2012-06-22
    • 2010-10-03
    • 1970-01-01
    相关资源
    最近更新 更多