扫码关注官方订阅号
C++Primer中:任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。ps:顶层const表示指针本身是个常量;底层const表示所指对象是个常量。
例:
const char *m; // 底层const string t=static_cast(m);
为什么这样的操作合法,而且t是可写的,static_cast难道也去除了const属性?
t
static_cast
const char *的意思是pointer to const char,不是const pointer to char,它就是个普通指针而已,本身不是const,所以你可以用static_cast把它转型成string 刚才没看清你的问题,重新答一下static_cast<T>(x)的语义差不多是这样的:以x为参数构造一个T类型的返回值,这个转型的过程必需是在编译期可以确定的。 如果有const int x=10:static_cast<int>(x)是正确的,因为你可以从一个const int构造一个intstatic_cast<const int &>也是正确的,因为你可以依据const int获得一个const int &static_cast<int &>是不正确的,因为你不能从const int获得一个int &,此时必需用const_cast 在你的例子中,你的确可以从const char *正常构造一个std::string,因为std::string有这么一个构造函数。 但是你不能从const char *构造一个int,只能得到一个const int。
const char *
pointer to const char
const pointer to char
const
string
static_cast<T>(x)
const int x=10
static_cast<int>(x)
const int
int
static_cast<const int &>
const int &
static_cast<int &>
int &
const_cast
std::string
代码折叠??
const char *m; // 底层const string t=static_cast<string>(m);
这里用到构造函数string (const char* s);来生成string实例, 即是向编译器保证 不会去更改char* m指向的内存. 实际上, 这里string重新开辟了一段内存, 把char* m的内容进行了拷贝. 所以更改string实例不会更改char* m的内容.
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
const char *的意思是pointer to const char,不是const pointer to char,它就是个普通指针而已,本身不是const,所以你可以用static_cast把它转型成string刚才没看清你的问题,重新答一下
static_cast<T>(x)的语义差不多是这样的:以x为参数构造一个T类型的返回值,这个转型的过程必需是在编译期可以确定的。如果有
const int x=10:static_cast<int>(x)是正确的,因为你可以从一个const int构造一个intstatic_cast<const int &>也是正确的,因为你可以依据const int获得一个const int &static_cast<int &>是不正确的,因为你不能从const int获得一个int &,此时必需用const_cast在你的例子中,你的确可以从
const char *正常构造一个std::string,因为std::string有这么一个构造函数。但是你不能从
const char *构造一个int,只能得到一个const int。代码折叠??
这里用到构造函数string (const char* s);来生成string实例, 即是向编译器保证 不会去更改char* m指向的内存. 实际上, 这里string重新开辟了一段内存, 把char* m的内容进行了拷贝. 所以更改string实例不会更改char* m的内容.