【问题标题】:using declarations and const overloads使用声明和 const 重载
【发布时间】:2011-10-23 06:08:17
【问题描述】:

假设我在一个基类中有两个版本的operator->(在 const 上重载)。如果我说

using Base::operator->;

在派生类中,我可以访问两个版本还是只访问非常量版本?

【问题讨论】:

    标签: c++ inheritance operator-overloading constants using-declaration


    【解决方案1】:

    与隐藏名称相同的业务。要么全有,要么全无。使用声明 (7.3.3) 会带来 name,而不是 member

    ISO/IEC 14882 (2003),7.3.3。 1/ using-declaration 将名称引入声明式 using 声明出现的区域。这个名字是同义词 用于在其他地方声明的某个实体的名称。

    我鼓励你阅读 7.3.3,里面有一些微妙的东西。您不能 using-declare 模板,您 using-declare 名称所引用的所有成员都必须是可访问的,这些名称与找到 using 声明的块中的名称一起被考虑用于重载解析(即它们不隐藏任何东西) 等等等等。

    【讨论】:

      【解决方案2】:

      您可以访问该父级中具有相同名称的方法/运算符的所有版本。

      【讨论】:

        【解决方案3】:

        两者都有。你试过了吗? (该死的答案很短:嗯,这是示例:

        #include <iostream>
        #include <string>
        
        struct bar
        {
          void foo() { std::cout << "non_c:foo()" << std::endl; }
          void foo() const { std::cout << "c:foo()" << std::endl; }
        };
        
        class base
        {
        public:
          bar* operator->() { return &b; }
          bar const* operator->() const { return &b; }
        
        private:
          bar b;  
        };
        
        class derived : public base
        {
        public:
          using base::operator->;
        };
        
        
        int main(void)
        {
          const derived d = derived();
          derived e;
        
          d->foo();
          e->foo();
        }
        

        【讨论】:

        • 我拒绝通过使用特定编译器尝试某些东西来学习语言语义。
        • @Fred,没错——但纯粹是好奇?否则为什么不简单地阅读标准?
        • @Nim:每次你想知道某事时阅读整个标准有点不切实际,就像记住整个事情一样。 SO 作为索引比实际索引效果更好;-)
        • @Steve - 我的情绪完全正确,通常是这些事情,我先尝试,然后确认它是否是标准行为......但我想每个人都有自己的方法......
        • @FredOverflow: 问一个随机的人群要好得多?我会去标准检查...
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 2015-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-10
        相关资源
        最近更新 更多