static_cast强制转型疑问

C++Primer中:任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。ps:顶层const表示指针本身是个常量;底层const表示所指对象是个常量。

例:

const char *m;      // 底层const
string t=static_cast<string>(m);

为什么这样的操作合法,而且t是可写的,static_cast难道也去除了const属性?

阅读 5.5k
3 个回答

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构造一个int
static_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 *m;      // 底层const
string t=static_cast<string>(m);

这里用到构造函数string (const char* s);来生成string实例, 即是向编译器保证 不会去更改char* m指向的内存. 实际上, 这里string重新开辟了一段内存, 把char* m的内容进行了拷贝. 所以更改string实例不会更改char* m的内容.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题