Я столкнулся с некоторыми раздражающими проблемами с постоянной корректностью в некотором шаблонном коде, который в конечном итоге сводится к следующему наблюдению: по какой-то причине, учитывая тип контейнера stl-ish t, const typename t :: pointer на самом деле не дает постоянного типа указателя, даже если t t :: pointer . /> Следующий пример иллюстрирует проблему. Предположим, у вас есть шаблонная функция, которая принимает контейнер, который должен соответствовать требованиям концепции концепции случайного доступа STL. < /P>
Код: Выделить всё
template
void example(Container& c)
{
const typename Container::pointer p1 = &c[0]; // Error if c is const
const typename Container::value_type* p2 = &c[0];
}
< /code>
Тогда, если мы передаем эту функцию a const container ... < /p>
const std::vector vec(10);
example(vec);
... Мы получаем неверное преобразование из const int* в int*. Но почему контейнер const typename :: pointer не то же самое, что const int* в этом примере? C ++ Стандартные требования контейнера (23,5, таблица 65)), и поэтому я не хочу его использовать. (Я действительно не вижу, как это сделать без использования Boost :: MPL :: if_ вместе с Type_traits, чтобы проверить, является ли контейнер постоянным, но должен быть менее многословный способ сделать это)
На случай, если это важно, я использую GCC 4.3.2, чтобы составить это.
Подробнее здесь:
https://stackoverflow.com/questions/164 ... st-pointer