代码之家  ›  专栏  ›  技术社区  ›  Nick

什么是C中的常量和方法++

  •  0
  • Nick  · 技术社区  · 4 年前

    我看到了这样的代码。

    这是什么 & 这种方法的官方名称是什么?

    struct S{
        int get() const &{
            return 5;
        }
    };
    
    int main(){
        S s;
        return s.get();
    }
    
    0 回复  |  直到 4 年前
        1
  •  2
  •   Amir Kirsh    4 年前

    这个 const & 方法上的签名意味着调用对象应绑定到常量左值引用。

    然而 since rvalue can be bound to a const lvalue ref ,将编译以下代码:

    struct S{
        int get() const &{
            return 5;
        }
    };
      
    
    int main(){
        return S{}.get(); // compiles, S{} can be bound to const lvalue
    }
    

    要了解&您可以为&&或删除常量:

    带有const&&:

    struct S{
        int get() const &{
            return 5;
        }
        int get() const && {
            return -5;
        }
    };
      
    int main(){
        return S{}.get(); // returns -5
    }
    

    与&但没有常数:

    struct S{
        int get() & {
            return 5;
        }
    };
      
    int main(){
        return S{}.get(); // compilation error cannot bind rvalue to lvalue
    }
    
        2
  •  1
  •   Andy Newman    4 年前

    这个 const 意味着函数本身是const-该函数修改类/结构的成员数据项是编译时错误,因此可以使用对类实例的const引用来调用该函数。

    拖尾 & 非常不寻常(我从未在野外见过)。这意味着对用于调用此函数的实例的引用必须是左值。后面跟着的函数 && 必须从右值调用。

    我相信一个函数可以声明和定义两次,一次是用&并且曾经与&&,因为它构成签名的一部分。这对于某些模糊的优化非常有用(显然)。