C++ Primer p.164
const char* cp; // error: static_cast can ’ t cast away const char* q = static_cast<char*>(cp); static_cast<string>(cp); // ok: converts string literal to string const_cast<string>(cp); // error: const_castonly changes const ness
不懂第六行代码及其注释;
这行代码是将指向 const char 的指针类型显式转换为 string ?
但注释中 string literal 如何理解呢?难道是指 pointer 的地址字面量?
恳请各位解惑,感谢!
1 hitmanx 2019-07-04 17:42:23 +08:00 ![]() >> 这行代码是将指向 const char 的指针类型显式转换为 string ? 是 >> 但注释中 string literal 如何理解呢?难道是指 pointer 的地址字面量? const char* cp = "abc"; // "abc"就是这里的 string literal |
![]() | 2 stebest 2019-07-04 17:42:55 +08:00 ![]() 理解为 C 风格的字符串转化为 C++风格的 string 吧。 字符串字面量转 string |
3 ruoshan 2019-07-04 18:45:49 +08:00 ![]() string 的构造函数有一个是这个: `basic_string( const CharT* s, const Allocator& alloc = Allocator() );` static_cast<std::string>(cp) 和 std::string(cp) 是一样的效果. 你可以编译一下 `g++ -std=c++11 -g -S x.cc` 看一下 `x.s`. 他们两个编译出来的代码是一样的. |
![]() | 4 fetich OP @hitmanx 奇怪的是,cp 是未初始化的,而且括号里的 cp 前没有 * 号;如果这么解释,那省略的部分太多了,对读者来讲,很晦涩。 |
6 exonuclease 2019-07-04 22:32:56 +08:00 ![]() 因为 string 有一个构造函数是 std::string::basic_string(const char *_Ptr) 所以第二行转换可以成功 相当于 auto s1 = string(cp); 原因是 string 要支持从字符串字面量构造 |
![]() | 7 mxalbert1996 2019-07-04 23:06:45 +08:00 via Android ![]() "string literal"指“字符串字面值”,也就是你用双引号引用的内容,这里没有明确写出来而已。 |
![]() | 8 mxalbert1996 2019-07-04 23:08:54 +08:00 via Android ![]() @fetich 你记住 C 风格的字符串类型是(const char*)就行了,这个懂一点 C 的话还是很好理解的 |
![]() | 9 fetich OP @mxalbert1996 我标注一下,以后学习深入了,就理解了这部分了。 |
![]() | 10 qihehulian 2019-07-05 02:03:17 +08:00 via iPad ![]() static cast 等于没有用。string 当中的 operator 重载把等于重载了,static cast 就是直接用等于号,等同默认隐式转换。 |
![]() | 11 alexmy 2019-07-05 10:16:14 +08:00 有 4 年没有用,都忘得差不多了。 |
![]() | 12 wutiantong 2019-07-05 10:16:39 +08:00 @qihehulian 不懂别瞎讲。 |
![]() | 13 twoconk 2019-07-05 15:20:25 +08:00 string test = const_cast<string>(cp) 编译错误:在类型‘ std::string {aka std::basic_string<char>}’上使用 const_cast 无效,因为它既不是指针,也不是引用,也不是数据成员指针 string test = static_cast<string>(cp); 等同于:string test = cp; (隐式类型转换) char* q = const_cast<char*>(cp);、//const_cast 转换符是用来移除变量的 const 修饰符,所以这行代码是对的 |