为什么必须将一个参数转换为const?

时间:2014-03-10 18:05:43

标签: c++ visual-studio const

我的理解是参数声明中的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));
}

什么是基础理论?

2 个答案:

答案 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对象。