关于复制构造函数和 NRVO
Posted
技术标签:
【中文标题】关于复制构造函数和 NRVO【英文标题】:Regarding copy constructor and NRVO 【发布时间】:2015-11-18 03:09:32 【问题描述】: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,这两个错误都会消失。但是为什么它会给出错误呢?
【问题讨论】:
什么是Date
?声明可能涉及此错误。确切的错误也会有所帮助。
请出示mcve。
Date 是我用 3 个私有变量 day、month 和 year 创建的类。
显示您的代码。我们不想猜测您输入的内容。单个字符可以改变 C++ 代码的含义。
@CodeMaxx - 如果你的Date
构造函数都是private
,这段代码怎么编译?如果没有,请贴出真实代码,不要贸然打码。
【参考方案1】:
即使复制构造函数被编译器优化,代码仍然必须正确编译,就像理论上调用了复制构造函数一样。您需要将复制构造函数的参数设为 const 引用才能获取临时对象。
【讨论】:
理论上的电话也应该通过有什么具体原因吗?在任何特殊情况下有什么不同吗? @CodeMaxx 是一种安全机制。如果类不提供复制自身的安全方法,则在禁用时按值返回它,即使编译器可以优化副本。以上是关于关于复制构造函数和 NRVO的主要内容,如果未能解决你的问题,请参考以下文章