【发布时间】:2014-08-15 15:19:01
【问题描述】:
我不会说我完全理解 const 正确性的概念,但至少可以说我理解它。所以,当我遇到这种情况时,我/我被难住了。有人可以向我解释一下吗。考虑以下代码:
#include <iostream>
struct Test {
int someInt;
void * pSomething;
};
void TestFunc(Test * const pStruct) {
pStruct->someInt = 44;
pStruct->pSomething = "This is a test string"; // compiler error here
}
int main() {
Test t;
TestFunc(&t);
return 0;
}
在我用注释进行注释时,我从 gcc(cygwin 为 4.5.3)收到此错误:
foo.cpp:10:24: error: invalid conversion from `const void*' to `void*'
这显然与结构包含 void* 的事实有关,因为一些实验表明将结构更改为:
struct Test {
int someInt;
char * pSomething;
};
产生警告而不是错误。此外,保持结构不变但修改此行以包含以下强制转换会编译代码而不会发出警告:
pStruct->pSomething = (void*)"This is a test string"; // no error now
鉴于我对 const 正确性 的理解,我不明白为什么编译器会发出此错误,“从 'const void*' 到 'void*' 的无效转换” ”?既然函数定义上的 const 修饰符使得指针是常量但它指向的不是常量,为什么这会是一个问题?我假设发生了某种隐式转换,正如最初所写的那样,因为字符串文字类似于const char *,必须转换为void *。尽管如此,问题仍然存在,因为pStruct 指向的内容不是不变的。
作为参考,我阅读了const correctness here 和here。
【问题讨论】:
-
char*是特殊的,在指针转换方面有一个例外 -
为了详细说明@quantdev,
char *被允许指向一个字符串字面量以向后兼容C。但这是一种不好的风格。在 C++ 中,您应该考虑只有const char *可以指向字符串文字。