const限定符的类型推导失败

Ron*_*Ron 1 c++ templates const template-argument-deduction

在编写自定义迭代器类型时,我决定我希望能够从const迭代器转换为非const迭代器.我写了以下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;
}
Run Code Online (Sandbox Code Playgroud)

这是与代码的Godbolt链接

son*_*yao 5

对于const P,直接const合格P,给定Pint *,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) };
}
Run Code Online (Sandbox Code Playgroud)