¿Cómo lidiar con la inicialización del miembro de referencia no constante en objeto const?

Digamos que tienes una clase

    class C 
    {
      int * i;

      public:

         C(int * v):i(v) {};

         void method() const;  //this method does not change i
         void method();        //this method changes i
    }

Ahora es posible que desee definir const instancia de esta clase

    const int * k = whatever;
    const C c1(k); //this will fail

pero esto fallará debido al constructor C no int. const. (int * v)

por lo que se define un constructor const int

    C(const int * v):i(v) {}; //this will fail also

Pero esto también fallará, ya que el miembro de C "int * i" no es constante.

¿Qué hacer en tales casos? Utiliza mutable? ¿Fundición? ¿Preparar la versión const de clase?

Edición: Después de una discusión con Pavel (abajo) investigué un poco este problema. Para mí lo que hace C ++ no es correcto. El objetivo del puntero debe ser un tipo estricto, lo que significa que no podría, por ejemplo, hacer lo siguiente:

int i;
const int * ptr;
ptr = & i;

En este caso se trata la gramática del lenguaje.const Como promesa de no cambiar el objetivo del puntero. Adicionalmenteint * const ptr Es una promesa de no cambiar el valor del puntero en sí. Así tienes dos lugares donde se puede aplicar const. Entonces es posible que desee que su clase modele un puntero (por qué no). Y aquí las cosas se están cayendo en pedazos. La gramática de C ++ proporciona métodos const que pueden prometer no cambiar los valores del campo en sí, pero no hay una gramática que indique que su método no cambiará los objetivos de los punteros de su clase.

Una solución es definir dos clases.const_C yC por ejemplo. Sin embargo, no es un camino real. Con las plantillas, sus especializaciones parciales es difícil no meterse en un lío. También todas las posibles variaciones de argumentos comoconst const_C & arg, const C & arg, const_C & arg, C & arg no se vea bonita Realmente no sé qué hacer. Use clases separadas o const_casts, cada forma parece ser incorrecta.

En ambos casos, ¿debo marcar los métodos que no modifican el objetivo del puntero como const? O simplemente siga la ruta tradicional en la que el método const no cambia el estado del objeto en sí (al método const no le importa el objetivo del puntero). Entonces, en mi caso, todos los métodos serían const, porque la clase está modelando un puntero, por lo tanto el puntero en sí esT * const. Pero claramente algunos de ellos modifican el objetivo del puntero y otros no.

Respuestas a la pregunta(7)

Su respuesta a la pregunta