模板如何推导出 const 指针类型?

How template deduce const pointer type?

我试过 cppinsights 中的以下代码:

#include <iostream>
#include <string>
#include <type_traits>
#include <vector>

template<typename T>
void printType(T x) {
    std::cout << typeid(x).name() << std::endl;
}

void test() {
  const std::vector<int>::pointer a = new int[2];
  const int* c = new int[2];
  
  printType(a);//line15
  printType(c);//line16
  
  //delete
}

int main() {
  test();
}

输出如下:

/* First instantiated from: insights.cpp:15 */
#ifdef INSIGHTS_USE_TEMPLATE
template<>
void printType<int *>(int * x)
{
  std::operator<<(std::cout, typeid(x).name()).operator<<(std::endl);
}
#endif


/* First instantiated from: insights.cpp:16 */
#ifdef INSIGHTS_USE_TEMPLATE
template<>
void printType<const int *>(const int * x)
{
  std::operator<<(std::cout, typeid(x).name()).operator<<(std::endl);
}
#endif

既然std::vector<int>::pointer = int*,为什么const std::vector<int>::pointer a被解释为int*而不是const int*

顺便说一句:如果 pointervalue_type 替换,它们将被推断为 int 而不是 const int

在这种情况下,编译器如何处理 const

why const std::vector<int>::pointer a has been interpreted as int* instead of const int*?

因为std::vector<int>::pointerint*。限定 int* 的 const 是 int* const。它不是 const int* 又名 int const *,它是一种独特的类型。但是参数的常量性对模板的推导没有影响,所以不会推导为int* const.

Since std::vector<int>::pointer = int*, why const std::vector<int>::pointer a has been interpreted as int* instead of const int*?

因为 const std::vector<int>::pointer 将被解释为 int* const 而不是 const int*。向指针添加 const 限定符使其自身不可修改,而不是它指向的值。

如果您需要 const int*,那么您应该使用 std::vector<int>::const_pointer 而不是 const std::vector<int>::pointer