Я нахожу это раздражающим, что я могу вызвать неконстантные функции объекта, если у меня есть указатель на этот объект. Я не могу позволить указателю быть указателем const, потому что есть также неконстантные функции, которые мне нужно вызвать. Поэтому мой единственный вариант, похоже, делает static_casts, чтобы гарантировать, что константа также работает по указателям. Вот минимальный пример:Что такое static_cast накладные расходы при добавлении константы при сохранении того же типа?
class MyClassImpl
{
MyClassImpl(void) : m_i(0) {}
int increment(void) {
++m_i;
return m_i;
}
private:
int m_i;
};
class MyClass
{
MyClass(void) : m_pImpl(new MyClassImpl()){}
~MyClass(void) {
delete m_pImpl;
}
int doNothing(void) const {
m_pImpl->increment(); // works although MyClassImpl::increment() is non-const
// static_cast<const MyClassImpl *>(m_pImpl)->increment(); // this will not compile because of non-constness
}
private:
MyClass(const MyClass & rhs);
MyClassImpl * m_pImpl;
};
Однако, мне интересно, имеет ли static_cast какие-либо затраты во время выполнения. Полностью оцениваются static_casts во время компиляции или есть некоторые накладные расходы, предполагая, что doNothing() вызывается часто.
Редактировать: Мой вопрос отличается от C++ static_cast runtime overhead, потому что в моем случае static_cast добавляет только константу. Другие пользователи, которые могут найти этот вопрос, могут быть заинтересованы в указанном вопросе.
Накладные расходы зависят от типов. Если вы только добавляете const, то нет накладных расходов. –
Почему 'static_cast' вместо' const_cast'? – nwp
@nwp: static_cast может добавлять константу, но не удалять ее. Const_cast может удалить константу. Следовательно, static_cast более безопасен. – Fabian