1

我有一个函数的 API,比如:

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

即该函数获取空终止字符串[ s] 及其大小[ ss] 的const 数组。我在运行时得到字符串并且不知道它们的数量。我想做的是定义vector<char*> vS- 将字符串插入它并定义vector<size_t> vSS- 将字符串大小插入它。最终我应该转移vector<char*> vSconst char** 和。我知道存在一个技巧/ 。问题是上面分别生成和。我错过了const。如何解决问题?vector<size_t> vSSconst size_t*&vS[0]&vSS[0]char**size_t* ss

4

3 回答 3

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**在于该函数可以修改其中一个指针以指向 a const char。然后调用者将拥有一个指向该const对象的非常量指针,没有什么可以阻止他尝试修改它。繁荣!未定义的行为。)

于 2013-01-23T14:09:00.570 回答
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);

但以上任何一种方式都可以。)

于 2013-01-23T14:03:49.683 回答
1

如果您将参数传递给函数(而不是尝试将结果传递回参数),那么非常量不是问题:您可以在需要的char *任何地方cont char *使用。

但是双指针 -const char **等存在问题。它们不会隐式转换,因为它可能导致 const 违规。您可以阅读C++ FAQ Light中的说明。

在您的情况下,您可以vector<const char*>像@aschepler 所说的那样创建一个。

顺便说一句,const char**不是“指向 char 的指针的 const 指针”,而是“指向指向 char 的 const 指针的指针”,const如果要确保函数不会更改外部指针内容,则必须添加另一个。const char * const *char const * const *, 相同 - 指向 const 的指针 指向 const 字符的指针。

(顺便说一句,在处理多个 const 时,从右到左阅读 relly 会有所帮助:尝试使用上一段中的最后一个表达式。是的,您可以const在此表达式的末尾添加另一个以获取“指向 const 指针的 const 指针”常量字符")。

于 2013-01-23T14:08:53.147 回答