Fyl*_*lax 1 c++ uniform-initialization list-initialization
假设我有这个结构:
struct MyStruct {
int field1;
char *field2;
MyStruct(int a, char* b): field2(b) {
field1 = doStuff(a);
}
MyStruct(int a): MyStruct(a, nullptr) {}
~MyStruct();
}
Run Code Online (Sandbox Code Playgroud)
据我所知,这不是一个聚合,因为我有一些构造函数.
我想要实现的是以自定义方式使用花括号初始化程序,这意味着使用如下代码:
MyStruct x = { 1, "string" };
Run Code Online (Sandbox Code Playgroud)
它隐式调用正确的构造函数(在本例中是第一个).
这有可能吗?
你快到了. MyStruct x = { 1, "string" };被称为复制列表初始化.它将尝试MyStruct使用braced-init-list提供的参数从可用的构造函数构造a
你的问题是,你的构造需要char*,同时"string"是一个const char[N]可以衰减到一个const char*,而不是一个char*.所以做出改变的事情
struct MyStruct {
int field1;
const char* field2;
MyStruct(int a, const char* b): field2(b) {
field1 = a;
}
MyStruct(int a): MyStruct(a, nullptr) {}
~MyStruct() {}
};
Run Code Online (Sandbox Code Playgroud)
然后
MyStruct x = { 1, "string" };
Run Code Online (Sandbox Code Playgroud)
将工作.如果你想使这个多一点防弹你可以改变field2是一个std::string和使用
struct MyStruct {
int field1;
std::string field2;
MyStruct(int a, const std::string& b): field1(a), field2(b) {}
MyStruct(int a): MyStruct(a, "") {}
~MyStruct() {}
};
Run Code Online (Sandbox Code Playgroud)