【问题标题】:Difference between l-value ref-qualified member function and unqualified member function?l-value ref-qualified member function 和 unqualified member function 之间的区别?
【发布时间】:2015-06-06 00:39:52
【问题描述】:

左值引用限定成员函数和非限定成员函数之间有区别吗?如果有,是什么?

即,这两种声明func() 的方式是否不同?

class Foo
{
  void func();
  void func() &;
};

我的意思不是“它们是否足够不同以允许重载解析”,因为很明显,当func() 的两个版本都存在时,上述类不会编译。我的意思是,当包含 & 和不包含 & 时,编译器的行为如何以及为什么会有所不同?

至少有一个区别,那就是 ref 限定函数(左值或右值类型)不能用非 ref 限定函数重载。来自current standard draft

同名同名的成员函数声明 参数类型列表以及成员函数模板 具有相同名称、相同参数类型列表和 相同的模板参数列表不能被重载,如果它们中的任何一个,但不是 全部,有一个 ref 限定符。

...但如果这是唯一的区别,为什么要限制?即,为什么不能将 foo()&& 视为(不合格)foo() 的有效覆盖?

【问题讨论】:

    标签: c++ c++11 overload-resolution ref-qualifier


    【解决方案1】:

    它们是不同的。

    Foo foo;
    std::move(foo).func();
    

    将调用func(),但不会调用func()&

    同样:

    Foo make_foo() { return {}; }
    make_foo().func();
    

    仅适用于void func() 签名,不适用于void func()& 签名。

    void func()& 表示它只是对左值的有效调用,而不是右值。

    【讨论】:

    • 哦,有道理。 void func()& 是否有less 限制? (我没想到会这样,但是...)return {}; 到底是什么?它只是默认初始化一个返回类型的值吗?我以前没见过。
    • @KyleStrand 我不确定你的意思,但可能不是。 return {}; 直接用零参数构造返回值。
    • 对不起,这就是我的意思——不是默认初始化。
    • @KyleStrand 从 C++11 开始,大括号括起来的列表可以隐式转换为临时列表
    • 一个使用左值引用的好地方是在赋值运算符中:T &operator=(T t) &,这将阻止bar() = 5;,例如bar()按值返回
    猜你喜欢
    • 2021-04-22
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多