Почему мне разрешено вызывать this-> deviceContext-> gt; из функции-члена const?

Я не понимаю, почему это разрешено:

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? В идеальном мире этот код не будет компилироваться, верно?

1

Решение

предположительно 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
}
5

Другие решения

Вы не вызываете неконстантную функцию для ее члена, вы разыменовываете ее член (который не изменяет ее, поэтому разрешается делать с const указатель) и затем вызов неконстантного члена в результате этого разыменования.

2

Вы не вызываете неконстантную функцию для ее членов, вы обращаетесь к указателю (который является константным), который указывает на неконстантный объект. Таким образом, вы можете вызывать неконстантные функции для него.

Что касается стиля, метод const — это метод, который не меняет состояние объекта с точки зрения пользователя. Таким образом, вы должны подумать о себе, если этот указатель доступа делает это или нет. Некоторые классы являются кандидатами на распараллеливание, и в этом случае методы const рассматриваются как безопасные методы распараллеливания, поскольку они должны быть без побочных эффектов.

Поэтому, чтобы квалифицировать метод для const, я бы предложил, чтобы он:

  • Не подходит для распараллеливания и не имеет видимых для пользователя побочных эффектов.
  • Является кандидатом на распараллеливание, но имеет правильную синхронизацию или вообще не имеет побочных эффектов.
1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector