1

我不明白为什么这是允许的:

void Renderer::UpdateTextureFromArray(unsigned int* colors, unsigned int size, TextureData* textureData) const
{
    D3D11_MAPPED_SUBRESOURCE ms;
    this->deviceContext->Map(textureData->texture, 0, D3D11_MAP_WRITE_DISCARD, NULL, &ms);

    memcpy(ms.pData, colors, sizeof(unsigned int) * size * size);
    this->deviceContext->Unmap(textureData->texture, 0);
}

我将 UpdateTextureFromArray 函数设为 const,但我仍然可以在其成员上调用非常量函数吗?

在这种情况下,将函数标记为 const 对我来说是不好的风格吗?

编辑:澄清一下,如果我有这样的函数,它是对社会“撒谎”吗?在一个完美的世界里,这段代码不会编译,对吧?

4

3 回答 3

5

推测deviceContext是指针数据成员,所以const方法不能修改指针。但是允许修改指针指向的对象:

struct Bar {
  void bar() {} // non const method
};

struct Foo {
  Foo() : p(0) {}
  void foo() const { p->bar();} // const method calling non-const method of Bar
  Bar* p;
};

int main()
{
  const Foo f;
  f.foo();  // OK, Foo::p is not modified
}
于 2013-02-20T22:50:07.680 回答
2

您不是在其成员上调用非常量函数,而是在取消引用其成员(不会修改它,因此允许使用const指针完成),然后在结果上调用非常量成员取消引用。

于 2013-02-20T22:51:38.117 回答
1

您不是在其成员上调用非常量函数,而是在访问指向非常量对象的指针(即常量)。因此,您可以在其上调用非常量函数。

关于样式, const 方法是一种不会从用户角度改变对象状态的方法。因此,您必须考虑此指针访问是否执行此操作。一些类是并行化的候选者,在这种情况下,const 方法被认为是安全的并行化方法,因为它们应该没有副作用。

因此,为了限定一个方法的 const,我建议它:

  • 不是并行化的候选者并且没有用户可见的副作用
  • 是并行化的候选者,但具有适当的同步或根本没有副作用。
于 2013-02-20T23:05:44.097 回答