const_cast
используется либо для удаления, либо для добавления «константности» объекта.
Однако, каков эффект или поведение такого приведения, которое не меняет «постоянство»?
Другими словами, что произойдет, если const_cast<Class&>(object)
наносится на object
который уже неконстантен Class
тип.
Точно так же, что произойдет, если const_cast<const Class&>(object)
наносится на object
, который уже const Class
тип.
Хотя я чувствую, что это должно быть четко определено, но все же хотел это подтвердить. Особенно, если есть какая-либо авторитетная ссылка или что-то в стандартах.
Случай использования: В шаблонном коде иногда, чтобы избежать лишнего кода, мы можем захотеть const_cast
каждый объект идет своим путем. Это может быть передано с const
или неconst
объекты. например
struct X {
void foo ();
};
template<typename T>
void call_foo (T& t) // `T` is either `X` or `const X` (& possibly children of `X`)
{
X& x = const_cast<X&>(t);
x.foo();
}
Предположим, что нас пока не волнует volatile
спецификатор.
Это прекрасно. Там не будет никакого эффекта — как будто у вас не было const_cast
совсем.
Обратите внимание, что вы можете использовать std::is_const
проверить, является ли конкретный тип постоянным Но если единственная причина сделать это, чтобы избежать неоперативного const_cast
Я бы не стал беспокоиться.
Если объект не const
, с помощью const_cast<>
удалять const
Несс не имеет значения. Удаление атрибута из чего-то, что уже не имеет этого атрибута, логически ничего не делает.
Исключением является, например, если объект также является изменчивым;
volatile SomeType x; // const qualifier may also be used here
SomeType &something = const_cast<SomeType &>(x);
который также удаляет volatile
классификатор, будь то x
является const
или нет. Любое использование чего-либо для доступа x
затем вызывает неопределенное поведение.
Если этот пример изменен на что-то вроде
SomeType y;
volatile SomeType& x(y);
SomeType &something = const_cast<SomeType &>(x);
затем с помощью something
законно (так как y
не является летучим), но если x
используется для изменения y
каким-то образом, компилятор может или не может гарантировать, что эти изменения отражены, когда something
доступ (или наоборот). Это сделало бы довольно сложной проверку того, что код работает как задумано, если (скажем) обработчик сигнала что-то делает с x
,
Для вашего случая использования нет смысла использовать const_cast
, Перегрузить функцию достаточно просто, поэтому требуется const
или неconst
ссылка.
void func(Something &x);
void func(const Something &x);
где второй будет называться, если дан const
объект. С помощью const_cast
удалять const
Несс не имеет эффекта в первом. Во-вторых, это потенциально позволяет изменить что-то, что не подлежит изменению, поэтому может привести к неопределенному поведению (если неconst
ссылка используется таким образом).