请注意,我只使用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
。
答案 0 :(得分:30)
请注意,*first
是左值表达式,然后decltype(*first)
的结果类型为const int&
,即对const int
的引用。引用不是const
本身(它不能是const限定的,没有int& const
这样的东西),使用std::remove_const
会产生相同的类型,即{{1 }}
3)如果参数是
类型的任何其他表达式const int&
和b)如果表达式的值类别是左值,则
T
得出decltype
;
您可以将T&
与std::remove_const
一起使用:
std::remove_reference
顺便说一句:
请注意,我只使用
std::remove_const<std::remove_reference<deref>::type>::type // -> int ~~~~~ // -> const int & ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // -> const int
来获取错误中的可读类型:
请注意,它没有为此案例提供正确的类型。这是来自Effective Modern C++ (Scott Meyers):
的类模板助手std::thread
并将其用作
template<typename T>
class TD;
您将收到包含TD<deref> td;
类型的错误消息,例如来自clang:
deref