初始混淆

sta*_*tan 3 c++ visual-studio-2008 visual-studio

不确定适当的标题,但它来自这个讨论:

类型名称后的括号是否与new有区别?

在Visual Studio 2008上,当我运行以下代码时:

struct Stan
{
    float man;
};

int main()
{
    Stan *s1 = new Stan;
    Stan *s2 = new Stan();

}
Run Code Online (Sandbox Code Playgroud)

检查本地,s1有一个带有随机值的未初始​​化的浮点数.s2的值初始化为0.

但是,如果我添加一个字符串数据成员,则两个实例中的float都是未初始化的.

struct Stan
    {
            std::string str;
        float man;
    }; 
Run Code Online (Sandbox Code Playgroud)

但是,两个实例中的字符串都已初始化.我尝试添加其他非POD类而不是字符串,但后一种情况仅在我添加字符串数据成员时才会出现.我认为添加一个字符串仍然是一个POD类?如果它不是POD类,那么无论括号如何都应该初始化值,对吧?当我添加一个字符串数据成员时,没有初始化为什么浮动(和其他原始数据类型)的想法?

CB *_*ley 5

添加一个字符串会使结构停止成为POD类,因为POD类必须是一个聚合类,不包含非POD结构类型的成员,并且std::string具有(除其他之外)用户声明的构造函数,这使得它成为非POD结构.

这是Visual Studio 2008的已知错误/功能.它不支持非POD类型的C++ 03 值初始化,例如第二个示例中的结构.

对于第二个示例中的结构,应该发生的是浮点数未初始化new Stan但初始化为零new Stan().

具有用户声明的默认构造函数的类型通过在所有情况下调用该构造函数来初始化,这恰好发生.

看到这里这里.