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;
};

以上是c++11使用{0}初始化结构体的问题的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>