C ++: борьба с общим константомC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 C ++: борьба с общим константом

Сообщение Anonymous »

Я столкнулся с некоторыми раздражающими проблемами с постоянной корректностью в некотором шаблонном коде, который в конечном итоге сводится к следующему наблюдению: по какой-то причине, учитывая тип контейнера 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»