【发布时间】:2019-12-06 11:11:05
【问题描述】:
我在 .pro 中使用了QMAKE_CXXFLAGS += -fno-elide-constructors,但无法获得所需的输出。
我在 Windows 10 上使用 Qt 5.9.8 MinGW 32bit
这就像 qmake 忽略了我的标志。
#include <iostream>
using namespace std;
using std::cout;using std::endl;using std::cin;
class C {
public:
C(){cout<<"C0";}
C(const C&){cout<<"Cc";cout<<endl;}
};
C fun(C c=C()) { C X=c;return X;}
int main()
{
cout<<"1"<<endl;
C c;
cout<<endl;
cout<<"2"<<endl;
fun(c);
cout<<endl;
cout<<"3"<<endl;
C y=fun();
cout<<endl;
cout<<"4"<<endl;
fun(fun());
cout<<endl;
cout<<"5"<<endl;
fun();
cout<<endl;
}
这是预期的输出:
1 C0
2 抄送 抄送 抄送
3 碳酸盐 抄送 抄送 抄送
4 碳酸盐 抄送 抄送 抄送 抄送 抄送
5 碳酸盐 抄送 抄送
这是我得到的:
1 C0
2 抄送 抄送
3 C0Cc
4 碳酸盐 抄送
5 C0Cc
解决方案:
构建 -> 清理项目 现在您的 .pro 文件已更新为新标志
【问题讨论】:
-
您使用的是哪个 C++ 版本?
-
在我看来,编译器似乎已经优化了
C X=c;,但它并没有省略副本,因为return X;调用了复制构造函数。 -
@RinatVeliakhmedov 设置为 c++11,我试过没有
-
@Mestkon 是的,但它应该使用 fno-elide-constructors 来做到这一点
-
@Archetipo 是的,所以在我看来,该标志正在按预期工作,并且您的预期输出是错误的,因为该标志不会阻止优化变量。只有临时变量传递给复制构造函数。
C X=c;在这种情况下不是临时变量。