C++ g++;和-fno-elide构造函数标记-编译器出错或代码中有bug?

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::

以下使用-fno-elide构造函数编译的g++代码似乎给出了错误的结果。如果没有-fno-elide构造函数标志,它似乎可以正常工作

  • 这是我程序中的一个bug吗?(经验表明,当我发布完这篇文章后,这个bug很可能会向我跳出来——如果有!)

  • 如果不是,那么-fno-elide constructors标志的错误结果是什么


  • #包括
    /*
    使用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;
    }