c++ - Const 与数组到指针的转换

标签 c++ arrays type-conversion constants language-lawyer

fa 中对 constness 的处理是有意的,还是看起来像一个错误(编译器或标准)?我知道这是怎么发生的,但仍然感觉很奇怪(至少我希望 a = "qwe" 也被视为错误——就像在 中一样fs).

typedef char A[8];
typedef char *P;
typedef std::string S;

void fa( const A a ) {
    a = "qwe"; // ok
    // *a = 'Q'; // error
}

void fp( const P p ) {
    // p = "qwe"; // error
    *p = 'Q'; // ok
}

void fs( const S s ) {
    // s = "qwe"; // error
    // *s = 'Q'; // error
}

[MinGW 4.9.1]

澄清:我了解此转换的一般工作方式,因此是“我可以看到这是如何发生的”部分。这个问题是关于 (a) std 引用(感谢那些提供它们的人),以及 (b) 这个怪癖是否有实际的理由(这是非常违反直觉的)。

最佳答案

A 的类型为 char[8]const Aconst char[8]fa 的参数因此是 const char[8],它衰减为指针 const char*,所以 中的一切都很好fa,因为您正在将字符串文字(类型为 const char[SIZE])分配给指针 a

P 的类型为 char*const P 的类型为 char* const(不是 const char*),因为 const 应用于指针。所以你不能将 p 分配给其他指针。 *p = 'Q' 可以,因为您正在分配指针指向的位置。因此,第二个函数 fb 的行为也符合预期。

关于c++ - Const 与数组到指针的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30352301/

相关文章:

javascript - 为什么不需要的数据被推送到我的数组中?

rbind/data.frame 转换类型层次结构 R

c++ - 当我将 true 分配给 int 变量时,为什么编译器不会提示?

c++ - 分配时的内存损坏

c++ - 如何在多个窗口中同时模拟鼠标移动?

Boost中的c++ Hermite插值算法

python - 将给定向量 (B) 的每个值舍入为 A 中最接近的值

arrays - 循环遍历数组并一次显示单个项目,并具有动态持续时间,例如react js中的setTimeout或SetInterval

regex - 流畅地将字段转换为整数

c++ - 代码块调试器不停止