【问题标题】:Meaning of ampersand in method declaration [duplicate]方法声明中&符号的含义[重复]
【发布时间】:2016-12-09 07:47:30
【问题描述】:

我知道const 限定符在方法声明中的含义(使*this const),但我无法理解这些行中的& 符号的含义:

MyClass &operator =(const MyClass&) & = default;
//                                  ^- this one
bool operator ==(const MyClass &right) const &;
//                                 that one -^

decltype(*this) 不总是MyClass& / const MyClass& 吗?那么这里的 & 符号是什么意思呢?

【问题讨论】:

  • 这意味着该方法只能在 MyClass 类型的左值上调用(而不是右值)。所以不能做MyClass() = my_class_instancefunctionReturningMyClass() = my_class_instance。同样,关闭括号后的&& 表示“只能在右值上调用”。
  • 致反对者:有没有试过用谷歌搜索特殊字符?效果不是很好。 @IgorTandetnik,你为什么不把你的评论作为答案?
  • @Kay 可能是因为他知道这会被欺骗,并希望避免在重复的问题上发布重复的答案。

标签: c++ methods reference qualifiers


【解决方案1】:
  1. 那么这里的 & 符号是什么意思?

意思是ref-qualified member functions:

非静态成员函数可以用左值引用限定符(函数名后面的标记 &)或右值引用限定符(函数名后面的标记 &&)来声明。在重载决议期间,类 X 的非静态 cv 限定成员函数被视为一个函数,如果它没有 ref-qualifiers 或如果它具有 lvalue ref-qualifier,则该函数采用对 cv-qualified X 的左值引用类型的隐式参数.否则(如果它具有右值引用限定符),则将其视为一个函数,该函数采用对 cv 限定 X 的右值引用类型的隐式参数。

您可以同时定义(左值/右值引用限定符),重载决议将选择合适的。如:

bool operator ==(const MyClass &right) const &;
bool operator ==(const MyClass &right) const &&;
  1. 不是 decltype(*this) 总是 MyClass& / const MyClass& 吗?

注意*this 的类型即使在右值引用限定函数中也不会改变。

注意:与 cv-qualification 不同,ref-qualification 不会更改 this 指针的属性:在右值 ref-qualified 函数中,*this 仍然是左值表达式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 2013-11-30
    相关资源
    最近更新 更多