c++ - 为什么必须将参数强制转换为 const?

标签 c++ visual-studio constants

我的理解是,参数声明中的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/

相关文章:

c++ - 带 alpha channel 的纹理覆盖背景对象

c++ - boost 变体的 spirit 传承

c++ - visual studio 2013如何链接opencv等dll文件输出exe

string - 为什么使用 const 字符串参数时程序会崩溃?

c++ - 为什么需要虚拟 thunk?

c++ - 丢失和再次找到时的对象跟踪

visual-studio - 我在哪里可以找到漂亮的 Dark ReSharper(带有颜色标识符 = on)主题?

windows - 如何读取 WinRT 错误?

c++ - 运行Levenstein代码时出现问题

c++ - 无法访问 C++ std::set 中对象的非常量成员函数