c++ 将c样式字符串传递给模板函数

o8x7eapl  于 2023-03-05  发布在  其他
关注(0)|答案(1)|浏览(117)

我无法理解我的程序的以下行为。据我所知,模板参数推导只允许1)数组或函数到指针的转换或2)常量转换。下面的程序应该会导致编译错误。但是,如果我传递两个等长的c风格字符串,它会编译。是什么导致了这种行为?

#include <iostream>
#include <type_traits>
  
  
template <typename T>
int compare(T& x, T& y) {
  return 1;
}
  
  
int main() {
   compare("abc", "abc"); // no compilation error
}
eeq64g8w

eeq64g8w1#

你可以在这里使用cpp-insights to have a look,你会看到你生成的函数签名是:

template<>
int compare<const char[4]>(const char (&x)[4], const char (&y)[4])
{
  return 1;
}

这是因为这两个常量的类型都是const char[4],并且你在签名中引用了它们,结果是const&的原因是你的类型带来了const,同样的工作方式:

template <typename T>
int foo(T& x) {
  return 1;
}

...

  int a = 5;
  const int& r_a = a;
  foo(r_a);

相关问题