这是抛弃康斯特吗?

Is this casting away const?

本文关键字:康斯特 抛弃      更新时间:2023-10-16
const char cp[]="jkasdkasjsad";
string a=static_cast<string>(cp);//"const string a" also runs without any error

我整个下午都停留在上面的代码上。C++ Primer只给出这样的代码

const char cp[]="jkasdkasjsad";
static_cast<string>(cp);

有人可以告诉我我的代码合法吗?我可以称之为"抛弃康斯特"吗,因为在"字符串a"之前没有"康斯特"?

任何定义良好的类型转换(涉及低级 const 的类型转换除外(都可以是 使用static_cast请求。例如,我们可以强制我们的表达式使用 浮点除法,通过将其中一个操作数转换为双精度

我对上面的描述感到困惑,"那些涉及低级常量"是什么意思?涉及作业的左侧或右侧?任何人都可以救我..非常感谢!

正在复制cp数组中的字符串,字符串变量不是常量

const char cp[] = "jkasdkasjsad";
std::string a = static_cast<std::string>(cp);

相当于:

std::string ab = cp;

cp衰减到指向数组第一个元素cp指针

在这种情况下根本没有

真正的转换。

static_cast<string>(cp);

等效于调用字符串构造函数

string(cp);

cp 构造的 string 类型的临时变量将从 static_cast 返回。因为,我认为我们谈论 std::string,而不是这个构造函数将被称为

basic_string( const CharT* s,
              const Allocator& alloc = Allocator() );

构造字符串,其内容使用 以 S 指向的以 null 结尾的字符串。的长度 字符串由第一个空字符确定。

根据C++标准的第 5.2.9/4 条,您的代码是完全合法的:

T表达式e可以使用 static_cast表格static_cast<T>(e)声明是否T t(e); 对于某些发明的临时变量 T (8.5( 来说,格式良好。这 这种显式转换的效果与执行 声明和初始化,然后使用临时变量 作为转换的结果。

对于您的示例,Tstd::stringecp 。不会因为新对象的创建而抛弃恒常性。与此比较:

char* p = static_cast<char*>(cp); // error