Учитывая следующий код:Косвенно вызов неконстантных функций на константном объекте
class foo;
foo* instance = NULL;
class foo
{
public:
explicit foo(int j)
: i(j)
{
instance = this;
}
void inc()
{
++i;
}
private:
int i;
};
ли следующий с помощью определенного поведения?
const foo f(0);
int main()
{
instance->inc();
}
Я спрашиваю, потому что я использую реестр класса, и я не сразу изменить f
было бы неплохо, чтобы сделать его const
, но потом на f
модифицируется косвенно в реестре.
EDIT: Определенное поведение Я имею в виду: Является ли объект помещен в какую-либо специальную ячейку памяти, которая может быть записана только один раз? Память только для чтения не может быть и речи, по крайней мере до constexpr из C++ 1x. Постоянные примитивные типы, например, являются (часто) помещается в память только для чтения, и делать const_cast
на него может привести к непредсказуемому поведению, например:
int main()
{
const int i = 42;
const_cast<int&>(i) = 0; // UB
}
Несомненно, линия instance = this; не будет компилироваться, так как вы назначаете указатель const (this) указателю (const), отличному от const. –
@drspod: Нет такой конструкции, как конструктор const. это никогда не будет const в любом конструкторе, если бы он был const, как бы вы инициализировали члены? – dalle