Visual Studio 2015: разрешен набор константных указателей?
Мы скоро перейдем к VS2015, и я нашел это в списке изменений:
const
Стандарт С++ всегда запрещал контейнеры из константных элементов (например, вектор или набор). Visual С++ 2013 и ранее приняли такие контейнеры. В текущей версии такие контейнеры не работают для компиляции.
источник
Мне было интересно, знает ли кто-нибудь, относится ли это к набору.
Я знаю, что карта все еще может содержать указатели константы в качестве ключей, поскольку они все равно const.
Пример:
std::set<const QObject*>
Могу ли я это сделать? Я бы не подумал, согласно сообщению на сайте Microsoft.
Ответы
Ответ 1
const QObject*
- это указатель на const QObject
. Сам указатель все еще может быть изменен. const QObject* const
сделает сам указатель const
.
Поскольку статья Microsoft рассказывает о const
объектах, которые const QObject*
не, ваш пример в порядке.
Ответ 2
Я знаю, что карта все еще может содержать указатели константы как ключи, так как они все равно const.
std::set<T* const>
всегда был недействительным, а std::map<int* const, int* const> s;
всегда был действительным. Причина в том, что распределитель для std::set
равен std::allocator<Key>
, тогда как распределитель для std::map
равен std::allocator<std::pair<const Key, T>>
. По определению a std::allocator<const T>
плохо сформировалось. Если вы хотите, чтобы код map
вышел из строя, вам нужно указать собственный распределитель следующим образом:
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}};