C++ g++;和-fno-elide构造函数标记-编译器出错或代码中有bug?
以下使用-fno-elide构造函数编译的g++代码似乎给出了错误的结果。如果没有-fno-elide构造函数标志,它似乎可以正常工作C++ g++;和-fno-elide构造函数标记-编译器出错或代码中有bug?,c++,c++11,C++,C++11,以下使用-fno-elide构造函数编译的g++代码似乎给出了错误的结果。如果没有-fno-elide构造函数标志,它似乎可以正常工作 这是我程序中的一个bug吗?(经验表明,当我发布完这篇文章后,这个bug很可能会向我跳出来——如果有!) 如果不是,那么-fno-elide constructors标志的错误结果是什么 #包括 /* 使用g++-fno-elide构造函数编译,不使用 -fno elide构造函数标志 */ 甲级{ 公众: ClassA():myVal(100){ std::
#包括
/*
使用g++-fno-elide构造函数编译,不使用
-fno elide构造函数标志
*/
甲级{
公众:
ClassA():myVal(100){
std::cout在ClassA
的复制构造函数中不初始化ClassA::myVal
。因此a0.myVal
的值是不确定的,因为a0
是通过复制初始化初始化的
这仅在使用“-fno-elide构造函数”编译时才会出现,因为标准允许编译器删除副本,即使它更改了程序的可观察行为。在这种情况下,在不使用“-fno-elide构造函数”编译时,gcc直接构造a0
,而不使用中间构造函数,并且a0。myVal
最终是300
。当显式禁用复制省略时,gcc保留所有中间副本,因此通过直接初始化构造的临时ClassA
的初始值将被复制构造函数丢失不复制该值的构造函数
如果将ClassA::myVal
初始化为ClassA
的复制构造函数中要复制的对象的值,则会得到预期的行为:
ClassA(const ClassA& other) : myVal(other.myVal) {
std::cout << "copy constructor called" << std::endl;
}
ClassA(const ClassA&other):myVal(other.myVal){
std::无法正确格式化您的代码。如果您放弃了这一点,您将放弃制作程序。您得到了什么结果?实际输出是什么?预期输出是什么?@一些程序员伙计:预期的答案是我用RVO得到的。现在,在迈尔斯·布德内克指出错误后,差异的原因显而易见。请。您需要告诉我们预期结果和实际结果(通过向我们显示)。要获得预期结果,请运行程序并将输出粘贴(作为文本)到问题中。对于预期输出,您可以使用实际输出作为基础,并对其进行修改。
ClassA(const ClassA& other) : myVal(other.myVal) {
std::cout << "copy constructor called" << std::endl;
}