[英]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) };
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.