gpt4 book ai didi

c++ - 为什么 std::remove_const 不删除 const 限定符?

转载 作者:IT老高 更新时间:2023-10-28 21:46:34 26 4
gpt4 key购买 nike

请注意,我使用 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正如我所料。

最佳答案

注意*first是一个左值表达式,那么decltype(*first)的结果类型就是const int&,即a引用 const int。引用不是 const 本身(它不能是 const 限定的,没有像 int& const 这样的东西),使用 std::remove_const 将产生相同的类型,即 const int&.

decltype specifier :

  1. If the argument is any other expression of type T, and

b) if the value category of expression is lvalue, then decltype yieldsT&;

您可以将 std::remove_conststd::remove_reference 一起使用:

std::remove_const<std::remove_reference<deref>::type>::type // -> int
^^^^^ // -> const int &
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // -> const int

顺便说一句:

Note that I use std::thread just to get readable types in the errors:

请注意,对于这种情况,它没有给出正确的类型。这是来自 Effective Modern C++ (Scott Meyers) 的类模板帮助器。 :

template<typename T>
class TD;

并将其用作

TD<deref> td;

您将收到包含 deref 类型的错误消息,例如来自 clang :

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

关于c++ - 为什么 std::remove_const 不删除 const 限定符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43454370/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com