首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于复制构造函数和NRVO

关于复制构造函数和NRVO
EN

Stack Overflow用户
提问于 2015-11-18 03:09:32
回答 1查看 129关注 0票数 0
代码语言:javascript
复制
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 .So返回一个对象--它不应该使用复制构造函数。但它仍然给出了一个编译器错误。如果我在复制构造函数argument.But中添加了一个const,那么这两个错误都消失了,为什么它会出现错误呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-18 03:21:51

即使编译器优化了复制构造函数,代码仍然必须正确编译,就像理论上调用了复制构造函数一样。为了获得一个临时对象,需要将复制构造函数的参数设置为const引用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33771155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档