请教《C++ Primer》一书中有关显式类型转换的问题

2019-07-04 17:32:12 +08:00
 fetich

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 的地址字面量?

恳请各位解惑,感谢!

3186 次点击
所在节点    C++
13 条回复
hitmanx
2019-07-04 17:42:23 +08:00
>> 这行代码是将指向 const char 的指针类型显式转换为 string ?

>> 但注释中 string literal 如何理解呢?难道是指 pointer 的地址字面量?
const char* cp = "abc"; // "abc"就是这里的 string literal
stebest
2019-07-04 17:42:55 +08:00
理解为 C 风格的字符串转化为 C++风格的 string 吧。 字符串字面量转 string
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`. 他们两个编译出来的代码是一样的.
fetich
2019-07-04 18:59:09 +08:00
@hitmanx
奇怪的是,cp 是未初始化的,而且括号里的 cp 前没有 * 号;如果这么解释,那省略的部分太多了,对读者来讲,很晦涩。
fetich
2019-07-04 19:00:38 +08:00
@ruoshan 惭愧,不明觉厉
exonuclease
2019-07-04 22:32:56 +08:00
因为 string 有一个构造函数是 std::string::basic_string(const char *_Ptr) 所以第二行转换可以成功 相当于 auto s1 = string(cp); 原因是 string 要支持从字符串字面量构造
mxalbert1996
2019-07-04 23:06:45 +08:00
"string literal"指“字符串字面值”,也就是你用双引号引用的内容,这里没有明确写出来而已。
mxalbert1996
2019-07-04 23:08:54 +08:00
@fetich 你记住 C 风格的字符串类型是(const char*)就行了,这个懂一点 C 的话还是很好理解的
fetich
2019-07-04 23:35:36 +08:00
@mxalbert1996 我标注一下,以后学习深入了,就理解了这部分了。
qihehulian
2019-07-05 02:03:17 +08:00
static cast 等于没有用。string 当中的 operator 重载把等于重载了,static cast 就是直接用等于号,等同默认隐式转换。
alexmy
2019-07-05 10:16:14 +08:00
有 4 年没有用,都忘得差不多了。
wutiantong
2019-07-05 10:16:39 +08:00
@qihehulian 不懂别瞎讲。
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 修饰符,所以这行代码是对的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/580066

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX