Подтвердить что ты не робот

Visual Studio 2015: разрешен набор константных указателей?

Мы скоро перейдем к VS2015, и я нашел это в списке изменений:

const

Стандарт С++ всегда запрещал контейнеры из константных элементов (например, вектор или набор). Visual С++ 2013 и ранее приняли такие контейнеры. В текущей версии такие контейнеры не работают для компиляции.

источник

Мне было интересно, знает ли кто-нибудь, относится ли это к набору. Я знаю, что карта все еще может содержать указатели константы в качестве ключей, поскольку они все равно const.

Пример:

std::set<const QObject*>

Могу ли я это сделать? Я бы не подумал, согласно сообщению на сайте Microsoft.

4b9b3361

Ответ 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}};