你能从"volatile const char*"构造一个字符串吗?(不使用`const_cast`

Can you construct a string from `volatile const char*` ? (without using `const_cast`)

本文关键字:const quot 字符串 cast 一个 char volatile      更新时间:2023-10-16

基本上我有volatile const char*,并且想要创建一个string。这里的volatile关键字很可能是不相关的(来自前一个开发人员的误解(,但无法轻易消除它(来自其他库(。

cannot convert argument N from 'volatile const char *' to 'std::string

我可以使用const_cast来强制转换volatile(并使编译器忽略volatile/const(。我对不使用const_cast的解决方案感兴趣。

是否存在其他方法,例如使用stringstream可能是一种解决方案?

只使用for循环,可能是一个选项:

volatile const char* cstr = "hello world";
std::string str;
for (volatile const char* pC = *cstr ; *pC != 0; ++pC) {
str.push_back(*pC);
}

您可以使用STL算法std::transform()对C字符串进行逐元素复制。

转换函数将有效地将每个volatile const char转换为char——这种转换在没有const_cast的情况下有效。使用std::back_inserter(),可以将生成的字符附加到std::string的末尾。

#include <iostream>
#include <string>
#include <algorithm>
int main()
{
volatile const char* cstr = "hello";
std::size_t len = 6; // your string's length
// this implicitly converts 'volatile const char' argument to 'char' parameter
auto func = [] (char c) { return c; };
std::string str;
std::transform(cstr, cstr + len, std::back_inserter(str), func);
std::cout << "string=" << str << ".n"; // outputs:  string=hello.
}

请注意,由于同样的原因,您不能使用std::strlen()——如果您没有大小,则需要编写自己的循环来计算它。