class Date
{
private:
int day,month,year;
public:
Date (int d,int m,int y)
{
day=d;
month=m;
year=y;
}
Date (Date &d)
{
day=d.day;
month=d.month;
year=d.year;
}
int monthDays(int month,int year)
{
if((year%4)==0){
if(month==4 || month==6 || month==9 || month==11){
return 30;
}
else
if(month==2){
return 29;
}
else
return 31;
}
else{
if(month==4 || month==6 || month==9 || month==11){
return 30;
}
else
if(month==2){
return 28;
}
else
return 31;
}
}
Date operator+ (const int k)
{
Date copy(day,month,year);
int inc_days=k;
if(inc_days<=(monthDays(copy.month,copy.year)-copy.day)){
copy.day+=inc_days;
return copy;
}
else{
inc_days-=(monthDays(copy.month,copy.year)-copy.day);
copy.day=monthDays(copy.month,copy.year);
while(inc_days>0){
copy.year+=(copy.month/12);
copy.month+=1-12*(copy.month/12);
if(inc_days>monthDays(copy.month,copy.year)){
copy.day=monthDays(copy.month,copy.year);
inc_days-=monthDays(copy.month,copy.year);
}
else{
copy.day=inc_days;
inc_days=0;
}
}
return copy;
}
}
};
int main()
{
Date d1(2,3,2004); //uses another constructor //line 1
Date d3(d1); //line 2
Date d2=d1+2; //uses overloaded + operator //line 3
}
Даже если строка 2 не принимает временный объект в качестве аргумента, я все равно получаю ошибку компилятора, если я не добавляю const в аргумент конструктора копирования.
В случае строки 3 перегруженный оператор возвращает объект, используя NRVO. Поэтому он не должен использовать конструктор копирования. Но это все равно дает ошибку компилятора. Обе эти ошибки исчезают, если я добавляю const в аргумент конструктора копирования. Но почему он должен выдавать ошибку?
Даже если конструктор копирования оптимизирован компилятором, код все равно должен правильно компилироваться, как если бы теоретически вызывался конструктор копирования. Вам нужно сделать параметр для конструктора копирования константной ссылкой, чтобы получить временный объект.
Других решений пока нет …