c++ pointers c++11 visual-studio-2015 containers

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.

source

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.