3
#include <iostream>

struct A
{
    void f() const &
    {
        std::cout << "A::f()&" << std::endl;
    }

    void f() const &&
    {
        std::cout << "A::f()&&" << std::endl;
    }
};

struct B
{
    void f() const &
    {
        std::cout << "B::f()&" << std::endl;
    }
};

int main()
{
    A{}.f();
    B{}.f();
}

输出是:

答::f()&&

B::f()&

注意void B::f() const &&不存在。

对我来说,应该选择B调用的临时对象,或者应该引发编译器错误。B::fvoid B::f() const &&

为什么会void B::f() const &在这种情况下选择?

4

1 回答 1

5

因为void B::f() const &&不存在,所以选择下一个最佳候选人,即您的void B::f() const &. 右值将绑定到 a const &。如果您删除 const,您会注意到您将收到编译错误,因为右值无法绑定到非 const 引用。cppreference/overloadresolution上的示例完美地展示了它。

int i;
int f1();
int g(const int&);  // overload #1
int g(const int&&); // overload #2
int j = g(i);    // lvalue int -> const int& is the only valid conversion
int k = g(f1()); // rvalue int -> const int&& better than rvalue int -> const int&

this这对于您的示例中的隐式参数没有什么不同。

对我来说,应该选择 B 的临时对象调用 B::f, void B::f() const &&,否则应该引发编译器错误。

如果是这种情况,那么在不存在 [const] 右值引用重载的情况下,如下代码将中断。

void f(const int& i)
{
    std::cout << i;
}

int main()
{
    f(3);
}
于 2018-10-26T01:55:18.350 回答