簡體   English   中英

const限定詞失敗的類型推導

[英]Type deduction with const qualifiers failing

在編寫自定義迭代器類型時,我決定希望能夠從const迭代器轉換為非const迭代器。 我寫了下面的remove_const函數。 由於某種原因,編譯器無法推斷const Pconst 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;
}

這是帶有代碼的Godbolt鏈接

對於const Pconst直接在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) };
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM