Я не понимаю, почему это разрешено:
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?
РЕДАКТИРОВАТЬ: Чтобы уточнить, это «ложь» для общества, если у меня есть функция, как этот const? В идеальном мире этот код не будет компилироваться, верно?
предположительно 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
}
Вы не вызываете неконстантную функцию для ее члена, вы разыменовываете ее член (который не изменяет ее, поэтому разрешается делать с const
указатель) и затем вызов неконстантного члена в результате этого разыменования.
Вы не вызываете неконстантную функцию для ее членов, вы обращаетесь к указателю (который является константным), который указывает на неконстантный объект. Таким образом, вы можете вызывать неконстантные функции для него.
Что касается стиля, метод const — это метод, который не меняет состояние объекта с точки зрения пользователя. Таким образом, вы должны подумать о себе, если этот указатель доступа делает это или нет. Некоторые классы являются кандидатами на распараллеливание, и в этом случае методы const рассматриваются как безопасные методы распараллеливания, поскольку они должны быть без побочных эффектов.
Поэтому, чтобы квалифицировать метод для const, я бы предложил, чтобы он: