@CrazyHenry
2018-01-31T11:12:41.000000Z
字数 1283
阅读 1296
<
string>
(m)ccccC++Primer
- Author:李英民 | Henry
- E-mail: li
_
yingmin@
outlookdot
com- Home: https://liyingmin.wixsite.com/henry
快速了解我: About Me
转载请保留上述引用内容,谢谢配合!
C++Primer中:任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。ps:顶层const表示指针本身是个常量;底层const表示所指对象是个常量。
<>
里有底层const,()内可以有可以无,但是如果要使得()
里的底层cosnt消失,必须使用const_cast例:
const char *m; // 底层const
string t=static_cast<
string>
(m);
为什么这样的操作合法,而且t是可写的,static_cast难道也去除了const属性?
static_cast<T>(x)
的语义差不多是这样的:以x为参数构造一个T类型的返回值,这个转型的过程必需是在编译期可以确定的。
如果有const int x=10
:
static_cast<int>(x)
是正确的,因为你可以从一个const int
构造一个int
,顶层const可以转换!
static_cast<const int &>(x)
也是正确的,因为你可以依据const int
获得一个const int &
,const int &a = x
合法;左侧有底层const,右侧可有可无。
static_cast<int &>
是不正确的,因为你不能从const int
获得一个int &
,此时必需用const_cast
,左侧没有底层const,右侧也不能有!
在你的例子中,你的确可以从const char *
正常构造一个std::string
,因为std::string
有这么一个构造函数。但是你不能从const char *
构造一个int
。
这里用到构造函数string (const char* s);
来生成string实例,将const char *m
传给const char *s
即是向编译器保证不会去更改m
指向的内存. 实际上, 这里string重新开辟了一段内存, 把*m
的内容进行了拷贝. 所以更改string实例不会更改m
所指的内容
const_cast
才能消除底层const:
const int ci = 10;
int &ri = const_cast<int &>(ci);//ci的顶层const降维为底层const
//将底层const消除,构造一个普通引用的临时量,
//然后用此临时量初始化 ri
//对ri进行修改将产生未定义的行为!
ri = 40;//error
char s[]="Hello";
const char *p = s;//底层const
char *pp = const_cast<char*>(p);//构造一个char*类型的指针,用其初始化pp
//可以使用pp修改所指内存
*pp = 'A';
cout<<pp<<endl;