C++ 无法从';常量字符*';至';字符*';对于std::string::c_str
这会产生错误:无法从“const char*”转换为“char*”C++ 无法从';常量字符*';至';字符*';对于std::string::c_str,c++,C++,这会产生错误:无法从“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>::iterato
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;
签名中忘记使用常量字符**。我不能改变它
记住,这是一个模拟,我只在单元测试中使用。在测试代码中,如果您确定界面的用户不会改变字符*,也许您可以使用
常量转换
假设调用者不拥有
char*
;如果是这种情况,那么您应该制作一份副本。如果您完全确定接口函数不会修改字符串,则可以使用
*result = const_cast<char *>((resultsI++)->c_str());
*result=const_cast((resultsI++->c_str());
要删除常量,请执行以下操作
否则,另一个选项是从使用std::vector
切换到std::vector
,但您必须确保正确地以null结尾字符串。尝试:
*result = &(*resultsI++)[0];
虽然这不能保证在C++11之前工作,但众所周知,它在大多数或所有当前编译器上都是正常的
危险在于,如果函数试图更改字符串的长度,可能会出现一些严重错误。更改单个字符应该可以。我猜你必须复制而不是使用
c_str()
。你可以(但不应该)抛弃常量(const_cast((resultsI++->c_str());)Ryan Guthrie:我为什么不应该这样做?常量是为了保护你自己。如果将其丢弃,您将失去这种保护。因此只有C++11指定std::string
必须使其内存连续?@Kos:这是正确的。尽管我所熟悉的大多数C++03实现实际上都使用连续存储,但在C++03标准中并不能保证这一点。当我需要C++03保证连续存储时,我通常使用vector
而不是string
@Kos,在对所有委员会成员的调查显示他们的std::string
实现已经符合要求后,保证被添加到C++11中。@JohnDibling,我也使用了vector
,这取决于任务。有时它很好,有时没有string方法会使它变得单调乏味。这里的危险是,对原始字符串的任何修改都可能导致它移动,并且它们不能保证它以“\0”结尾,如果将它传递给C-string函数,这可能是个问题。如果我做了这么危险的事,我喜欢让大家知道这是危险的。通过使用const_cast((resultsI++)->c_str())
您可以让它引人注目,因为我们知道不应该使用const cast。这样你就知道你的代码很糟糕,而且它很突出。
*result = &(*resultsI++)[0];