带有 const 限定符的类型推导失败
Type deduction with const qualifiers failing
在编写自定义迭代器类型时,我决定我希望能够从 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;
}
对于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) };
}
在编写自定义迭代器类型时,我决定我希望能够从 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;
}
对于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) };
}