以下のコードをコンパイルした所,

#include <iostream>
#include <cmath>
#include <limits>
using namespace std;

// 自動微分
template <class Type> class Dual
{

public:
  Type value, diff;
  Dual();
  Dual(Type v);
  Dual(Type v, Type d);  
  Dual<Type>& operator=(Dual<Type> &d1);
  Dual<Type> operator+(double x);
  Dual<Type> operator+(const Dual<Type> &d1);
};

// コンストラクタ
template <class Type> Dual<Type>::Dual(){value = 0, diff = 0;}
template <class Type> Dual<Type>::Dual(Type v){value = v, diff = 0;}
template <class Type> Dual<Type>::Dual(Type v, Type d){value = v, diff = d;}

// print
template <class Type> void print(Dual<Type> dual){
  cout << "Value: " << dual.value << ", Diff: " << dual.diff << endl;
}

// 代入
template <class Type> Dual<Type>& Dual<Type>::operator=(Dual<Type> &d1){
  value = d1.value;
  diff = d1.diff;
  return *this;
}

// Dualとスカラーの足し算
template <class Type>
Dual<Type> Dual<Type>::operator+(double x){
  Dual<Type> d2;
  d2.value = x + value;
  d2.diff = diff;
  return d2;
}

// Dual同士の足し算
template <class Type> Dual<Type> Dual<Type>::operator+(const Dual<Type> &d1){
  Dual<Type> d2(value, diff);
  d2.value += d1.value;
  d2.diff += d1.diff;
  return d2;
}

int main(int argc, char *argv[])
{
  Dual<double> dual1, dual2(4, 4);
  dual1 = dual2 + 3.0;
  print(dual1);
}

次のようなエラーが出ました。

hw2-1.cpp:166:9: error: no viable overloaded '='
  dual1 = dual2 + 3.0;
  ~~~~~ ^ ~~~~~~~~~~~
hw2-1.cpp:40:15: note: candidate function not viable: expects an l-value for 1st
      argument
  Dual<Type>& operator=(Dual<Type> &d1){
              ^

main()内の

 dual2 + 3.0 

が実行されるとDual型の値が返るので, 変数dual1に正しく代入できると考えたのですが, なぜエラーが出るのか教えて頂けますか