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?

¿Fue útil?

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top