MSVC2015 初始化 class 应该保持未初始化的成员

MSVC2015 initializes class member that should be left uninitialized

我注意到 MSVC2015 初始化了应该留给不确定的数据成员。 代码示例和结果:

class A
{
public:
    int i;
};

class B
{
public:
    B(){}
    int i;
};

class C
{
public:
    int i;
    virtual void vf(){}
};

int main()
{
    A a;    
    B b;    
    C c;   

    a.i;     //error C4700 uninitialized local variable used
    b.i;     //ok
    c.i;     //ok
}

如果我理解正确,在1、2、3这两种情况下,成员i应该被默认初始化,这对非class类型没有任何作用,这三种情况都应该发出错误.我的理解在这里正确吗?

通过检查程序集,在构造函数中生成一个 memset 到零 class 个成员,为什么 VS 这样做?在我的理解中,class X 的隐式默认构造函数的语义应该与 X(){} 相同,对吗?

并且通过添加虚函数,隐式构造函数不再是微不足道的,但我不知道 ctor 是否微不足道有什么区别。

编译器开关 /sdl 可能是原因。这是一项清零内存的安全功能。

查看投影属性 -> C++ -> 常规 -> SDL 检查

另请参阅投影属性 -> C++ -> 代码生成中的安全检查 (/GS)。

同时禁用它们,看看会发生什么。