[关闭]
@CrazyHenry 2018-01-31T11:12:41.000000Z 字数 1283 阅读 1296

4.x string t=static_cast<string>(m)

ccccC++Primer


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:

  1. const int ci = 10;
  2. int &ri = const_cast<int &>(ci);//ci的顶层const降维为底层const
  3. //将底层const消除,构造一个普通引用的临时量,
  4. //然后用此临时量初始化 ri
  5. //对ri进行修改将产生未定义的行为!
  6. ri = 40;//error
  1. char s[]="Hello";
  2. const char *p = s;//底层const
  3. char *pp = const_cast<char*>(p);//构造一个char*类型的指针,用其初始化pp
  4. //可以使用pp修改所指内存
  5. *pp = 'A';
  6. cout<<pp<<endl;
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注