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

时间:2013-05-21 18:28:34

标签: c++ c++11 initialization

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

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

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

2 个答案:

答案 0 :(得分:5)

无法从值列表初始化指针。您可以改为使用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};

这是live example

As suggested by Praetorian in the comments,您可能希望将std::vector替换为std::array,如果您可以明确指定容器的大小,并且大小不需要更改在运行时:

#include <array>

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

这是live example

答案 1 :(得分:5)

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

如果您要自己存储字符串(例如,在vector<string>中),那么第一个版本就可以工作。