c++ - Visual Studio 2015: ¿se permite un conjunto de punteros const?
pointers c++11 (2)
Estaremos actualizando a VS2015 pronto, y encontré esto en la lista de cambios de última hora:
elementos const
El estándar C ++ siempre ha prohibido los contenedores de elementos const (como vector o conjunto). Visual C ++ 2013 y anteriores aceptaron dichos contenedores. En la versión actual, tales contenedores no se compilan.
Me preguntaba si alguien sabe si esto también se aplica a un conjunto. Sé que un mapa todavía puede contener punteros const como claves, ya que son const de todos modos.
Un ejemplo:
std::set<const QObject*>
¿Todavía puedo hacer esto? Pensaría que no, de acuerdo con la publicación en el sitio de Microsoft.
Sé que un mapa todavía puede contener punteros const como claves, ya que son const de todos modos.
std::set<T* const>
siempre ha sido inválido, y std::map<int* const, int* const> s;
Siempre ha sido válido. El motivo es que el asignador para std::set
es std::allocator<Key>
, mientras que el asignador para std::map
es std::allocator<std::pair<const Key, T>>
. Por definición, un std::allocator<const T>
está mal formado. Si desea que el código del map
falle, deberá especificar un asignador personalizado como este:
int i = 42;
int* const j = &i;
std::map<int* const, int* const,
std::allocator<const std::pair<int* const, int* const>>> s{{j, j}};
const QObject*
es un puntero a un const QObject
. El puntero en sí sigue siendo modificable. const QObject* const
haría que el puntero en sí const
.
Dado que el artículo de Microsoft habla sobre objetos const
, que no es const QObject*
, su ejemplo está bien.