c++11使用{0}初始化结构体的问题
std::string, std::function类型是否可以用{0}初始化?
示范代码如下:
struct c_user
{
int id;
char name[64];
};
struct cpp_user
{
int id;
std::string name;
};
int main() {
c_user user1 = {0}; /// c语言常用
cpp_user user2{0}; /// c++11下是否安全?
std::string name{0}; /// gcc没报错,但是否正确?
//std::string name2(0); /// 会崩溃
return 0;
}
回答
问题补充:
最终决定弃用这种用法
之前描述不清楚,补充说明一下:
1 "是否安全",我希望是c++规范明确指出这是一个特性,而不是一个bug。按我的理解, std::string name{0}, std::string name(0)应该是相同的语义,如果会崩溃,两者都应该崩溃。测试其他的string类的实现,如Glib::ustring,Glib::ustring name{0}也是会崩溃的。这说明支持{0}初始化并不是所有string类的通用特性。
2 如果这是一个特性,我也希望个人写的类也有这个特性,如
//期望(0) {0}能调用到不同的构造函数,但不清楚如何实现
class mystring {
public:
//期望{0}能调用此构造函数,但事实上不会
mystring(){
std::cout << "default " << std::endl;
}
// mystring{0} mystring(0)都会调用此构造
mystring(const char *s){
std::cout << "const char " << (void *)s <<std::endl;
}
};
3 如果不能确定,可能用下面的的方式初始化,起码心里有底些
struct cpp_user {
int id{0};
std::string name;
};