如何从vector转换为const数组

时间:2013-01-23 13:55:50

标签: c++ pointers vector const

我有一个功能API,比如说:

void func (const char** s,const size_t* ss);

即。该函数获取空终止字符串[s]的const数组及其大小[ss]。 我在运行期间得到了字符串而没有意识到它们的数量。 我想做的是定义vector<char*> vS - 将字符串插入其中并定义vector<size_t> vSS - 将字符串大小插入其中。 最后我应该将vector<char*> vS转移到const char**vector<size_t> vSSconst size_t*。 我知道存在一个技巧&vS[0] / &vSS[0]。问题在于上面分别生成了char**size_t* ss但是我失踪了的常量即可。 问题如何解决?

3 个答案:

答案 0 :(得分:2)

如果您能够修复API以使其符合const,请将其更改为:

void func (const char* const* s,const size_t* ss);

否则,如果您不需要通过向量修改字符串内容,则将向量更改为:

vector<const char*> vS;

否则,您需要执行const_cast并信任API不要修改任何内容:

func(const_cast<const char**>(&vS[0]), &vSS[0]);

(如果您感兴趣,将char**传递给函数const char**的问题是该函数可以修改其中一个指向const char的指针。然后会有一个指向该const对象的非const指针,没有任何东西可以防止他试图修改它。轰!未定义的行为。)

答案 1 :(得分:1)

只需将vS声明为

即可
vector<const char*> vS;

然后&vS[0]const char**size_t*可以隐式转换为const size_t*

(顺便说一下,func可能应该是

void func(const char* const* s, const size_t* ss);

但上述方法无论如何都可以。)

答案 2 :(得分:1)

如果你将params传递给函数(而不是试图将结果传递回参数),那么非const'ness不是问题:你可以在char *的任何地方使用cont char *必需的。

但你有双指针问题 - const char **等。它们不会被隐式转换,因为它可能导致const违规。您可以在C++ FAQ Light中阅读解释。

在你的情况下,你可以创建一个vector<const char*>,正如@aschepler所说。

BTW,const char**不是“指向char的指针的const指针”,而是“指向char指针的指针”,如果你想确保函数没有,你必须添加另一个const t更改外部指针内容。 const char * const *char const * const *,它是相同的 - 指向const字符的const指针。

(顺便说一句,从右到左阅读在处理多个consts时非常有帮助:尝试使用上一段中的最后一个表达式。是的,你可以在这个exprssion结束时添加另一个const获取“指向const char的const指针的const指针”)。