无法将 std::字符串::c_str 的 'const char *' 转换为 'char *'

cannot convert from 'const char *' to 'char *' for std::string::c_str

本文关键字:char const 转换 str std 字符串      更新时间:2023-10-16

这给出了错误:无法从"const char *"转换为"char *"。

class Mock
{
public:
    ...
    static void func(char **result)
    {
          *result = (resultsI++)->c_str();
    }
static std::vector<std::string> results;
static std::vector<std::string>::iterator resultsI;
};
std::vector<std::string> Mock::results;
std::vector<std::string>::iterator Mock::resultsI;

如何在不更改函数函数接口的情况下有效地摆脱此错误?此接口的实现者:

void (func*)(char **result) 

忘记在签名中使用常量字符**。我无法改变它。

请记住,这是一个模拟,我只在我的单元测试中使用。

尝试:

*result = &(*resultsI++)[0];

虽然这不能保证在 C++11 之前有效,但已知在大多数或所有当前编译器上都可以。

危险在于,如果函数尝试更改字符串的长度,您可能会遇到一些令人讨厌的错误。更改单个字符应该没问题。

在测试代码中,如果您确定接口的用户不会改变 char*,也许您可以使用 const_cast

这假设调用者不拥有char *的所有权;如果是这种情况,那么你应该制作一个副本。

如果您绝对确定接口函数不会修改字符串,则可以使用

*result = const_cast<char *>((resultsI++)->c_str());

以消除const

否则,另一种选择是从使用 std::vector<std::string> 切换到 std::vector<std::vector<char>>但随后您必须确保正确 null 终止字符串。