用初始化列表初始化包含const数组的Struct

Initialize a Struct containing a const array with initializer list

本文关键字:初始化 Struct 数组 包含 列表 const      更新时间:2023-10-16

我使用c++ 11,并且有一个包含以下Struct的类:

struct Settings{
    const std::string name;
    const std::string* A;
    const size_t a;
};
class X {
    static const Settings s;
    //More stuff
};

.cpp文件中我想这样定义

X::s = {"MyName", {"one","two","three"}, 3};

但这不起作用。但是,使用中间变量

确实可以工作。
const std::string inter[] = {"one","two","three"};
X::s = {"MyName", inter, 3};

有没有办法做到没有中间变量?

指针不能从值列表初始化。您可以使用std::vector代替:

#include <vector>
struct Settings{
    const std::string name;
    const std::vector<std::string> A;
//        ^^^^^^^^^^^^^^^^^^^^^^^^
    const size_t a;
};

你可以这样写:

class X {
    static const Settings s;
    //More stuff
};
const Settings X::s = {"MyName", {"one","two","three"}, 3};

下面是一个的实例

正如Praetorian在评论中建议的那样,如果您可以明确指定容器的大小,并且在运行时不需要更改大小,则可以将std::vector替换为std::array:

#include <array>
struct Settings{
    const std::string name;
    const std::array<std::string, 3> A;
//        ^^^^^^^^^^^^^^^^^^^^^^^^^^
    const size_t a;
};

这里是的实例

这是因为你存储的是指向字符串数组的指针,而不是字符串本身;你需要一个字符串数组来指向某个地方。你所拥有的只是一个包含指向字符数组指针的大括号初始化器。

如果要存储字符串本身(例如在vector<string>中),则第一个版本可以工作。