Pregunta

El siguiente código dice que pasar el mapa como const al método operator[] descarta los calificadores:

#include <iostream>
#include <map>
#include <string>

using namespace std;

class MapWrapper {
public:
    const int &get_value(const int &key) const {
        return _map[key];
    }

private:
    map<int, int> _map;
};

int main() {
    MapWrapper mw;
    cout << mw.get_value(42) << endl;
    return 0;
}

¿Esto se debe a la posible asignación que se produce en el acceso al mapa? ¿No se pueden declarar const las funciones con acceso a mapas?

MapWrapper.cpp:10: error: passing ‘const std::map<int, int, std::less<int>, std::allocator<std::pair<const int, int> > >’ as ‘this’ argument of ‘_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = int, _Tp = int, _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int, int> >]’ discards qualifiers

¿Fue útil?

Solución

std::map 's operator [] no se declara como const, y no puede deberse a su comportamiento:

  

T & amplificador; operador [] (const Key & amp; key)

     

Devuelve una referencia al valor que se asigna a una clave equivalente a la clave, realizando la inserción si dicha clave aún no existe.

Como resultado, su función no puede declararse operator[], y usar el mapa find().

iterator la función const_iterator le permite busque una clave sin modificar el mapa.

std::pair devuelve un .first, o <= > a un .second que contiene la clave (at()) y el valor (std::out_of_range).

En C ++ 11, también puede usar <=> para <=>. Si el elemento no existe, la función genera una excepción <=>, en contraste con <=>.

Otros consejos

No puede usar operator[] en un mapa que es const ya que ese método no es _map[key] ya que le permite modificar el mapa (puede asignarlo a find). Intente usar el método <=> en su lugar.

Dado que operator[] no tiene una sobrecarga calificada const, no se puede usar de forma segura en una función calificada const. Esto se debe probablemente a que la sobrecarga actual se creó con el objetivo de devolver y establecer valores clave.

En su lugar, puede usar:

VALUE = map.find(KEY)->second;

o, en C ++ 11, puede usar el operador at() :

VALUE = map.at(KEY);

Algunas versiones más nuevas de los encabezados de GCC (4.1 y 4.2 en mi máquina) tienen funciones de miembro no estándar map :: at () que se declaran const y arrojan std :: out_of_range si la clave no está en el mapa.

const mapped_type& at(const key_type& __k) const

De una referencia en el comentario de la función, parece que esto se ha sugerido como una nueva función miembro en la biblioteca estándar.

Primero, no debe usar símbolos que comiencen con _ porque están reservados para la implementación del lenguaje / escritor del compilador. Sería muy fácil para _map ser un error de sintaxis en el compilador de alguien, y no tendría a nadie a quien culpar excepto a usted mismo.

Si desea utilizar un guión bajo, póngalo al final, no al principio. Probablemente cometió este error porque vio algún código de Microsoft haciéndolo. Recuerde, escriben su propio compilador, por lo que pueden salirse con la suya. Aun así, es una mala idea.

el operador [] no solo devuelve una referencia, sino que crea la entrada en el mapa. Entonces, no solo está obteniendo un mapeo, si no hay ninguno, está creando uno. Eso no es lo que pretendías.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top