2013-05-21 383 views
5

我用C++ 11和工作一个const阵列的STRUCT具有包含下面的结构一类:初始化含有初始化列表

struct Settings{ 
    const std::string name; 

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

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

.cpp文件I想要定义像这样

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

但这不起作用。但是,它会利用工作的一个中间变量

const std::string inter[] = {"one","two","three"}; 
X::s = {"MyName", inter, 3}; 

有没有办法做到这一点没有中间变量?

+3

你的struct *不包含一个const数组。它包含一个指向常量字符串的指针。考虑到这一点,应该很容易明白为什么你需要“中间变量”。 – juanchopanza

+0

@juanchopanza:嗯,我想'A'指向const Array的(开始处)。它也可能是一个指向“const std :: string”的指针,但那不是我想要的。但也许我不明白你指的是什么... – Haatschii

+1

@Haatschii:你混淆了一个事实,即一个数组衰减成一个指针,其数组和指针是相同的。就语言语义而言,数组不是指针。同样,初始化器列表不是数组。编译器可以用这样的列表初始化一个数组,并且它可以将一个数组衰减为一个指针,但是在您的示例中它不知道将列表转换为数组,然后将其衰减为指针。因此,需要中介,在赋值给指针之前将初始化器列表转换为连续数组。 –

回答

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::array更换std::vector,如果它是可以接受的,你要明确指定容器的大小,如果大小并不需要在运行时改变:

#include <array> 

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

这里是live example

+1

你能解释为什么使用矢量有所作为? – taocp

+1

@taocp:因为指针不能用值列表进行初始化。你想要的是可以从初始化列表 –

+3

或'std :: array '初始化的东西,如果你不需要它可以调整大小的话。 – Praetorian

5

这是因为你正在存储一个指向字符串数组的指针,而不是字符串本身;所以你需要一个指向某处的字符串数组。你所拥有的是一个包含指向字符数组的指针的括号初始化程序。

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