C++03中的大括号初始化

C++03中的大括号初始化,c++,c++03,c++builder-xe5,C++,C++03,C++builder Xe5,在C++03中,这个程序应该正确初始化字符串吗 #include <iostream> #include <string> struct A { std::string s; }; int main() { A a = { }; std::cout << a.s.size() << std::endl; } 使用bcc32 6.70,输出为256,在调试器中检查字符串时,其内部指针似乎是垃圾地址。A是一个,C++03

在C++03中,这个程序应该正确初始化字符串吗

#include <iostream>
#include <string>

struct A
{
    std::string s;
};

int main()
{
    A a = { };
    std::cout << a.s.size() << std::endl;

}
使用bcc32 6.70,输出为256,在调试器中检查字符串时,其内部指针似乎是垃圾地址。

A是一个,C++03允许使用带括号的初始值设定项列表初始化聚合。如果初始值设定项列表为空,则将初始化聚合的每个成员的值

来自C++03[dcl.init.aggr]/8

。。。空初始值设定项列表可用于初始化任何聚合。如果骨料不是空类,则应使用格式为T 5.2.3的值初始化骨料的每个成员,其中T表示未初始化成员的类型

在您的示例中,std::string成员应该是默认初始化的。

A是一个,C++03允许使用带括号的初始值设定项列表初始化聚合。如果初始值设定项列表为空,则将初始化聚合的每个成员的值

来自C++03[dcl.init.aggr]/8

。。。空初始值设定项列表可用于初始化任何聚合。如果骨料不是空类,则应使用格式为T 5.2.3的值初始化骨料的每个成员,其中T表示未初始化成员的类型


在您的示例中,std::string成员应该是默认初始化的。

bcc32究竟是什么?@KerrekSB是一个编译器,从外观上看:-S@KerrekSB我记不起c++11之前初始化的确切规则,在这个编译器中,结构B:A{B:A{};做同样的事情。也许它使用的是C++98 rulesEven在C++98中,默认初始化std::string不可能被允许绕过默认构造函数。bcc32到底是什么?@KerrekSB是一个编译器依赖于这样,从外观上看:-S@KerrekSB我记不起c++11之前初始化的确切规则,在这个编译器中,结构B:A{B:A{};做同样的事情。在C++98中,默认初始化std::string不可能被允许绕过默认构造函数。谢谢。C++98是一样的吗?@MattMcNabb我不确定。C++98没有值初始化,但即使如此,在这种情况下,如果不需要调用std::string的默认构造函数,我会非常惊讶。谢谢。C++98是一样的吗?@MattMcNabb我不确定。C++98没有值初始化,但即使如此,在本例中,如果不需要调用std::string的默认构造函数,我也会非常惊讶。