为什么成员`float x`用`0`初始化为main()中的对象`a`和`b`?

Wak*_*zil 9 c++ default-constructor c++11

有人可以指出标准中的哪个子句支持在Coliru中获得的以下行为,对于该片段:

#include <iostream>

class A
{
    int i;
    float x;

    public:
    A() : i(10) {}
    A(int i) : i(i) {}
    int GetI() { return i; }
    float GetF() { return x; }
};


int main()
{
    A a;
    A b(1);
    A x{};
    A y{1};
    std::cout << a.GetI() << '\n';
    std::cout << a.GetF() << '\n';
    std::cout << b.GetI() << '\n';
    std::cout << b.GetF() << '\n';
    std::cout << x.GetI() << '\n';
    std::cout << x.GetF() << '\n';
    std::cout << y.GetI() << '\n';
    std::cout << y.GetF() << '\n';
}
Run Code Online (Sandbox Code Playgroud)

代码打印:

10
0 < - 不应该是未知的?
1
0 < - 同上
10
0
1
0

编辑:

本段来自TCPL第4版,第490页:

为此,规则并不像我们想要的那样干净.对于静态分配的对象(第6.4.2节),规则与使用{}完全相同,因此alpha的值为{"","",0}.但是,对于局部变量和自由存储对象,默认初始化仅针对类类型的成员进行,而内置类型的成员未初始化,因此beta的值为{"","",unknown}.

Stroustrup先生对未定义的行为没有任何说明.

Die*_*ühl 7

0是未初始化变量可以获取的可能任意值之一:程序具有未定义的行为.鉴于内存开始零初始化0的可能性很大,可能是一个结果:IEEE 754表示0恰好全为零.但是,不能保证价值0.