C++中系统类型与自定义类型隐式转换与重载函数参数是否引用有什么关系?

简单描述,当重载 + 号参数为非引用时可以实现隐式转换
但若加上引用符号则不行,求解?

错误提示:
error: no match for 'operator+' (operand types are 'Complex' and 'double')|

#include <iostream>
using namespace std;

class Complex
{
public:

    Complex(){real=0,imag=0;}
    Complex(double r, double i){real=r, imag=i;}
    Complex operator - (Complex &c);
    Complex operator * (Complex &c);
    Complex operator / (Complex &c);
    Complex(double r){real=r,imag=0;}
    friend Complex operator+(Complex &c1, Complex &c2);
    //operator double(){return real;}
    void display();
private:
    double real;
    double imag;
};

Complex Complex::operator*(Complex &c)
{
    return (Complex(real*c.real, imag*c.imag));
}

Complex Complex::operator/(Complex &c)
{
    return (Complex(real/c.real, imag/c.imag));
}

Complex Complex::operator-(Complex &c)
{
    return (Complex(real-c.real, imag-c.imag));
}

void Complex::display()
{
    cout <<"(" <<real <<"," <<imag <<"i)" <<endl;
}

Complex operator + (Complex &c1,Complex &c2)
{
    return (Complex(c1.real+c2.real, c1.imag+c2.imag));
}

int main(void)
{
    Complex c1(2,4), c2(3,6), c3;
    double i = 7.0;
    c1.display(), c2.display();
    c3 = c2 + i;
    c3.display();
    c3 = c2 - c1;
    c3.display();
    c3 = c2 * c1;
    c3.display();
    c3 = c2 / c1;
    c3.display();

    return 0;
}

const &能正常调用,运算符重载参数一般都使用const &
至于为啥Complex &不行就不知道了,编译器似乎不认这个函数

Complex operator + (const Complex &c1, const Complex &c2);