web-dev-qa-db-ja.com

std :: remove_constがconst修飾子を削除しないのはなぜですか?

エラーで読み取り可能なタイプを取得するためだけにstd::threadを使用していることに注意してください。

int main() {
    const int * first;
    using deref = decltype(*first);
    std::thread s = std::remove_const<deref>::type{}; // const int ???
    std::thread s2 = deref{}; // const int
    std::thread s3 = std::remove_const<const int>::type{}; // int 
}

remove_const<deref>::typeconst intであり、私が期待するようにintは変更できないようです。

21
NoSenseEtAl

_*first_は左辺値式であることに注意してください。その場合、decltype(*first)の結果タイプは_const int&_、つまり_const int_への参照になります。参照はconst自体ではありません(const修飾することはできません。_int& const_のようなものはありません)。_std::remove_const_を使用すると、同じ型、つまり_const int&_。

decltype指定子 を参照してください:

3)引数がタイプTの他の式である場合、および

b)式の値カテゴリが左辺値の場合、decltypeは_T&_を生成します。

_std::remove_const_と_std::remove_reference_を一緒に使用できます。

_std::remove_const<std::remove_reference<deref>::type>::type // -> int
                                        ~~~~~               // -> const int &
                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~        // -> const int
_

ところで:

エラーで読み取り可能なタイプを取得するためだけに_std::thread_を使用していることに注意してください。

この場合、正しいタイプが得られないことに注意してください。これは、 Effective Modern C++(Scott Meyers) からのクラステンプレートヘルパーです。

_template<typename T>
class TD;
_

として使用します

_TD<deref> td;
_

derefのタイプを含むエラーメッセージが表示されます。例: from clang

_prog.cc:16:11: error: implicit instantiation of undefined template 'TD<const int &>'
TD<deref> td;
          ^
_
30
songyuanyao