Каков эффект от `const_cast`, когда изменение» const-ness » не требуется?

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 спецификатор.

2

Решение

Это прекрасно. Там не будет никакого эффекта — как будто у вас не было const_cast совсем.

Обратите внимание, что вы можете использовать std::is_const проверить, является ли конкретный тип постоянным Но если единственная причина сделать это, чтобы избежать неоперативного const_castЯ бы не стал беспокоиться.

4

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

Если объект не 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 ссылка используется таким образом).

1

По вопросам рекламы [email protected]