【问题标题】:What is const & method in C++什么是 C++ 中的 const & 方法
【发布时间】:2021-06-27 12:39:39
【问题描述】:

我看到过这样的代码。

& 是什么意思,这种方法的正式名称是什么?

struct S{
    int get() const &{
        return 5;
    }
};

int main(){
    S s;
    return s.get();
}

【问题讨论】:

  • & 被称为reference
  • 我知道参考是什么,但不知道你的意思。你能详细说明一下吗?
  • 技术术语:函数有一个ref-qualifier。这只是取自 C++ 语法,其中 ref-qualifier 是一个符号,用于表示 &&& 可能出现在函数声明符的那个位置。

标签: class c++11


【解决方案1】:

方法签名上的const & 表示调用对象应绑定到一个 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:

带有 const && 的重载:

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

有 & 但没有 const:

struct S{
    int get() & {
        return 5;
    }
};
  
int main(){
    return S{}.get(); // compilation error cannot bind rvalue to lvalue
}

【讨论】:

  • 我知道&&。谢谢。
【解决方案2】:

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

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

我相信一个函数可以被声明和定义两次,一次使用 &,一次使用 &&,因为它构成了签名的一部分。这对于某些晦涩的优化(显然)很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多