我的理解是参数声明中的const表示声明的函数不会改变const值。那么为什么这会对调用者传递的参数的常量提出要求呢?
定义代码:
void Func(const Foo**);
main()
{
Foo* fooPtr;
Func(&fooPtr);
}
Visual Studio 2012编译器产生:
> error C2664: 'Func' : cannot convert parameter 1 from 'Foo**' to 'const Foo**'
> Conversion loses qualifiers
但是以下工作:
main()
{
Foo* fooPtr;
Func(const_cast<const Foo**>(&fooPtr));
}
什么是基础理论?
答案 0 :(得分:4)
如果允许转换,则可以用它来规避const-correctness:
const Foo const_foo;
void evil(const Foo** p) {
*p = &const_foo; // *p is 'const Foo*', so this assignment is allowed
}
int main() {
Foo* p;
evil(&p); // modifies p to point to const_foo
p->modify(); // BOOM! Modifying a constant object
}
您可以转换为const Foo* const*
;这不允许您将Foo*
更改为指向其他任何内容,因此无法破坏const正确性。这比使用狡猾的演员更好,希望最好;虽然你应该问问自己为什么你不是简单地按值传递指针,如果你不想改变它。
答案 1 :(得分:0)
当Func(&amp; fooPtr)确实修改fooPtr同时保持* fooPtr不变时,应该有两个版本的Func(),一个用另一个定义:
void Func(const Foo**);
void Func(Foo** fooHndl)
{
Func(const_cast<const Foo**>(fooHndl));
}
这允许用句柄(**)调用Func()到const或非const对象。