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_cast only changes const ness
不懂第六行代码及其注释;
这行代码是将指向 const char 的指针类型显式转换为 string ?
但注释中 string literal 如何理解呢?难道是指 pointer 的地址字面量?
恳请各位解惑,感谢!
1
hitmanx 2019-07-04 17:42:23 +08:00 1
>> 这行代码是将指向 const char 的指针类型显式转换为 string ?
是 >> 但注释中 string literal 如何理解呢?难道是指 pointer 的地址字面量? const char* cp = "abc"; // "abc"就是这里的 string literal |
2
stebest 2019-07-04 17:42:55 +08:00 1
理解为 C 风格的字符串转化为 C++风格的 string 吧。 字符串字面量转 string
|
3
ruoshan 2019-07-04 18:45:49 +08:00 1
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 1
因为 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 1
"string literal"指“字符串字面值”,也就是你用双引号引用的内容,这里没有明确写出来而已。
|
8
mxalbert1996 2019-07-04 23:08:54 +08:00 via Android 1
@fetich 你记住 C 风格的字符串类型是(const char*)就行了,这个懂一点 C 的话还是很好理解的
|
9
fetich OP @mxalbert1996 我标注一下,以后学习深入了,就理解了这部分了。
|
10
qihehulian 2019-07-05 02:03:17 +08:00 via iPad 1
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 修饰符,所以这行代码是对的 |