我有一个功能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> vSS
到const size_t*
。
我知道存在一个技巧&vS[0]
/ &vSS[0]
。问题在于上面分别生成了char**
和size_t* ss
。但是我失踪了的常量即可。
问题如何解决?
答案 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所说。
const char**
不是“指向char的指针的const指针”,而是“指向char指针的指针”,如果你想确保函数没有,你必须添加另一个const
t更改外部指针内容。 const char * const *
或char const * const *
,它是相同的 - 指向const字符的const指针。
(顺便说一句,从右到左阅读在处理多个consts时非常有帮助:尝试使用上一段中的最后一个表达式。是的,你可以在这个exprssion结束时添加另一个const
获取“指向const char的const指针的const指针”)。