`x? 1:0`变成了40,未定义的行为?

时间:2014-07-11 07:46:35

标签: c++ undefined-behavior

我写了这段代码:

#include <cstdio>
#include <queue>

class Obj {
    bool x;
public:
    Obj(): x(true) {}
    Obj(Obj&& o) {
        o.x = false;
    }
    ~Obj() {
        if(x) {
            std::puts("Here");
            std::printf("%d\n", x ? 1 : 0);
        }
    }
};

int main() {
    std::queue<Obj> q;
    q.push(Obj());
    q.pop();
}

启用优化后,我得到了一个令人困惑的结果:

Here
40

通过以不同方式执行程序,该数字可以是1602496104。在Ideone上没有打印任何内容。

它一定是未定义的行为。但我无法弄清楚出了什么问题。 你能指出我的错误吗?

注意:我的编译器是GCC 4.8.1,我的操作系统是Windows 7。

1 个答案:

答案 0 :(得分:11)

您未在移动构造函数中初始化this->x。我非常确定未初始化变量的条件是未定义的行为。

#include <cstdio>
#include <queue>

class Obj {
    bool x;
public:
    Obj(): x(true) {}
    Obj(Obj&& o) : x(true) { // Hi!
        o.x = false;
    }
    ~Obj() {
        if(x) {
            std::puts("Here");
            std::printf("%d\n", x ? 1 : 0);
        }
    }
};

int main() {
    std::queue<Obj> q;
    q.push(Obj());
    q.pop();
}

以上工作符合预期(打印&#34;此处为1&#34;)。