【发布时间】:2020-02-04 18:48:21
【问题描述】:
我正在阅读 c++ 编程语言书籍,并且正在学习指向 char 的指针,
我找到了这个代码char s[] = "Gorm";
这提醒我字符串文字被隐式转换为 const char * 。
所以我对 lhs 和 rhs 不是同一类型感到困惑。
我从这里使用了在线编译器和代码:Is it possible to print a variable's type in standard C++?
了解编译器如何查看 lhs 和 rhs 的类型,
然后我发现 lhs 被视为 char[5] 而 rhs 被视为 char[5] const &
我可以解释 lhs ,
但我不明白什么是“对 5 个字符数组的常量左值引用”或
即使在 lhs char s[] 到 char* s 的隐式转换之后,
什么是“对指向非 const char 的非 const 指针的常量左值引用”?
根据定义常量不是左值引用“它仅指初始化它的值”???
那么为什么我们在“&”之前需要 const ???
那不同类型的lhs和rhs怎么分配??????
建议的答案对于理解 char s[] 如何从字符串文字 "it is language rule" 初始化非常有帮助。
但它没有回答关于表达式“char [5] const &”的部分问题???
const &这个奇怪的表达是什么意思?!!!const 指的是什么???
它是指左值引用本身吗???“根据定义,引用是常量,初始化后我们不能改变引用的值”???
还是引用数组const char的元素所以字符串字面量数组不能改变???
但在这种情况下,const 应该放在 char 之前或 char 之后而不是在 & 之前 ?????!!!
或 const 指的是 char[5] 类型,在这种情况下,它的重要性是什么????
通常数组在定义后不能改变大小或类型????
【问题讨论】:
-
字符串文字表示为
const char的静态分配数组。该数组的长度是文字中的字符数,加上一个用于 nul 终止符的字符。所以char s[] = "Gorm"创建s作为5 个char的数组,并将该数组的元素初始化为字符串文字的副本,即'G'、'o'、'r'、'm'和@987654346 @. -
您认为
const char*不能变成char*是正确的。由于 C++ 的古老遗产,从字符串文字初始化char*的特定情况在许多编译器中是一个例外。现代编译器至少应该发出警告,您可能希望保留const:godbolt.org/z/_Ycqg3 -
@MaxLanghof :在彼得的评论中,我知道 = 符号不是赋值,而是初始化,因此它采用字符串文字“Gorm”的常量元素并将它们转换为 s 中的非常量字符....但随后在 Max 评论中,他谈到了相同的数组,但它们隐式转换为指针......在初始化期间数组语法是否转换为指针??!!我认为不是......所以指针异常可能只适用于传递数组功能或在数组之间进行逻辑比较...
标签: c++ arrays string pointers char