const_cast vs static_cast
-
25-09-2019 - |
Pregunta
Para añadir const
a un objeto no const, que es el método preferido? const_cast<T>
o static_cast<T>
. En una reciente pregunta, alguien mencionó que prefieren utilizar static_cast
, pero yo habría pensado que const_cast
haría que la intención del código sea más clara. Entonces, ¿cuál es el argumento para utilizar static_cast
hacer una const variable?
Solución
No utilice tampoco. Inicializar una referencia const que se refiere al objeto:
T x;
const T& xref(x);
x.f(); // calls non-const overload
xref.f(); // calls const overload
O bien, utilizar una plantilla de función implicit_cast
, como el proporcionado en Boost :
T x;
x.f(); // calls non-const overload
implicit_cast<const T&>(x).f(); // calls const overload
Teniendo en cuenta la posibilidad de elegir entre static_cast
y const_cast
, static_cast
es claramente preferible: const_cast
sólo debe ser utilizado para arrojado de sí constness porque es el único elenco que puede hacerlo, y arrojando constness es inherentemente peligroso . Modificación de un objeto a través de un puntero o referencia obtenidos por colada de distancia constness puede resultar en un comportamiento indefinido.
Otros consejos
Yo diría static_cast
es preferible, ya que sólo le permitirá al elenco de la no-const
a const
(que es seguro), y no en la otra dirección (que no es necesariamente seguro).
Este es un caso de uso bueno para un implicit_cast plantilla de función.
Se puede escribir su propio reparto:
template<class T>
const T & MakeConst(const T & inValue)
{
return inValue;
}