Вывод типа с ошибками константных квалификаторов - PullRequest
0 голосов
/ 08 сентября 2018

При написании пользовательского типа итератора я решил, что хочу иметь возможность преобразовывать константные итераторы в неконстантные итераторы. Я написал следующую remove_const функцию. По какой-то причине компилятор не может сделать вывод, что const P совпадает с const int*. Ошибка, которую я получаю из GCC 8.2: types 'const P' and 'const int*' have incompatible cv-qualifiers.

Есть ли в моем коде что-то, что мешает компилятору правильно выводить? Кроме того, если есть лучший способ делать то, что я хочу, я бы хотел знать.

template <int, typename P>
struct my_iterator { P ptr; };

using iterator = my_iterator<3, int*>;
using const_iterator = my_iterator<3, const int*>;

template <int I, typename P>
my_iterator<I, P> remove_const(my_iterator<I, const P> it) {
    return my_iterator<I, P>{ const_cast<P>(it.ptr) };
}

int main() {
    const_iterator it{ nullptr };
    remove_const( it );
    return 0;
}

Вот ссылка Годболта с кодом

1 Ответ

0 голосов
/ 08 сентября 2018

Для const P, const указывается непосредственно для P, если P равно int *, const P будет int * const (т.е. указатель const), а не const int * (указатель до const).

Вы можете изменить код на

template <int I, typename PtoC>
auto remove_const(my_iterator<I, PtoC> it) {
    using PtoNC = std::add_pointer_t<std::remove_const_t<std::remove_pointer_t<PtoC>>>;
    return my_iterator<I, PtoNC> { const_cast<PtoNC>(it.ptr) };
}
...