我的理解是,参数声明中的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));
}
基本理论是什么?
最佳答案
如果允许转换,那么它可以用来规避常量正确性:
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* 更改为指向其他任何内容,因此不能破坏常量正确性。这比使用狡猾的 Actor 阵容并希望得到最好的结果更好。尽管您应该问自己,如果您不想更改指针,为什么不简单地按值传递指针。
关于c++ - 为什么必须将参数强制转换为 const?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22307879/