エラーで読み取り可能なタイプを取得するためだけに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>::type
はconst int
であり、私が期待するようにint
は変更できないようです。
_*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;
^
_