为什么std :: remove_const没有删除const限定符?

时间:2017-04-17 15:23:36

标签: c++ c++11 const typetraits decltype

请注意,我只使用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

1 个答案:

答案 0 :(得分:30)

请注意,*first是左值表达式,然后decltype(*first)的结果类型为const int&,即对const int的引用。引用不是const本身(它不能是const限定的,没有int& const这样的东西),使用std::remove_const会产生相同的类型,即{{1 }}

请参阅decltype specifier

  

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