自定义支撑初始化器

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)

它隐式调用正确的构造函数(在本例中是第一个).

这有可能吗?

Nat*_*ica 7

你快到了. 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)

  • 您可以使用`const`值初始化非`constst`变量.这里的问题是你不能使用`指向*const*`的指针初始化一个指向非`constst`*的*指针,因为那时你可以通过创建的指针改变值. (2认同)