consideran este código de ejemplo:¿Por qué std :: set.insert() devuelve un iterador no const y, sin embargo, no puedo modificarlo?
#include <set>
#include <string>
using namespace std;
set<string> string_set;
void foo(const string& a)
{
pair<set<string>::iterator, bool> insert_result = string_set.insert(a);
string& val = *(insert_result.first);
val += " - inserted";
}
Por lo tanto, la corrección a un lado, como no comprobar para la inserción exitosa y así sucesivamente, este código parece que debería permitir que me de modificación de la cadena después de la inserción, pero el compilador (VS2010) prohíbe desreferenciar el iterador a una cadena no const (estamos migrando desde VS2005 que agitó esto sin una advertencia).
Ahora, sé que esto debería estar prohibido, ya que puede hacer que la cadena no sea única, y estoy contento de que funcione de esta manera, pero en el caso real no es tan claro como eso, ya que Quiero enmendar un miembro de datos no mutable que no participe en las pruebas de equivalencia u orden.
Lo que quiero saber es, ¿cómo sabe el compilador que no puedo hacer esto, y cómo sé sin referencia a la documentación (que no menciona esto de todos modos)?
Saludos, Guy
No creo que devuelva 'const_iterator', creo que es el' primer' miembro, que es const. –
@Michael El estándar dice que es implementación definida. Ver edit –
@Michael: no hay 'first' para un' set', estás confundiendo con un 'map' creo, que almacena un' pair '. –