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

Haa*_*hii 5 c++ initialization c++11

我使用C++ 11并拥有一个包含以下结构的类:

struct Settings{
    const std::string name;

    const std::string* A;
    const size_t a;
};

class X {
    static const Settings s;
    //More stuff
};
Run Code Online (Sandbox Code Playgroud)

.cpp文件中我想像这样定义它

X::s = {"MyName", {"one","two","three"}, 3};
Run Code Online (Sandbox Code Playgroud)

但这不起作用.但是它确实可以使用中间变量

const std::string inter[] = {"one","two","three"};
X::s = {"MyName", inter, 3};
Run Code Online (Sandbox Code Playgroud)

有没有办法在没有中间变量的情况下做到这一点?

And*_*owl 5

无法从值列表初始化指针.你可以std::vector改用:

#include <vector>

struct Settings{
    const std::string name;
    const std::vector<std::string> A;
//        ^^^^^^^^^^^^^^^^^^^^^^^^
    const size_t a;
};
Run Code Online (Sandbox Code Playgroud)

然后你可以写:

class X {
    static const Settings s;
    //More stuff
};

const Settings X::s = {"MyName", {"one","two","three"}, 3};
Run Code Online (Sandbox Code Playgroud)

这是一个实例.

正如意见建议的执政官,你可能需要更换std::vectorstd::array,如果它是可以接受的,你要明确指定容器的大小,如果大小并不需要在运行时改变:

#include <array>

struct Settings{
    const std::string name;
    const std::array<std::string, 3> A;
//        ^^^^^^^^^^^^^^^^^^^^^^^^^^
    const size_t a;
};
Run Code Online (Sandbox Code Playgroud)

这是现场的例子.

  • 或者`std :: array <std :: string,3>`如果你不需要它可以调整大小. (3认同)

Mik*_*our 5

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

如果您要自己存储字符串(vector<string>例如,在a中),那么第一个版本将起作用.