将“T const &&t”与“int const *”匹配时的 C++ 模板函数参数推导说明
Explanation of the C++ template function argument deduction when matching `T const &&t` against `int const *`
我不明白在这种情况下参数推导规则是如何工作的。我有以下简单的代码片段:
template<typename T>
void fn(T const &&t) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
std::cout << typeid(decltype(t)).name() << std::endl;
}
int main() {
int const *ar = nullptr;
std::cout << typeid(ar).name() << std::endl;
fn(std::move(ar));
}
我得到的结果如下:
PKi
void fn(const T &&) [T = const int *]
PKi
我不明白的是为什么T
被推断为const int *
。为什么 const
没有匹配模式?
在参数声明 T const &&t
中,const
在 T
上限定,即 t
被声明为 rvalue-reference 到 const T
.
当传递 const int *
类型的 ar
时, T
被推导为 const int *
,那么 t
的类型将是 const int * const &&
,即 rvalue-reference 到 const
指向 const int
的指针。请注意,const
在不同的事物(在不同级别)上有资格,一种用于指针,一种用于指针。
我不明白在这种情况下参数推导规则是如何工作的。我有以下简单的代码片段:
template<typename T>
void fn(T const &&t) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
std::cout << typeid(decltype(t)).name() << std::endl;
}
int main() {
int const *ar = nullptr;
std::cout << typeid(ar).name() << std::endl;
fn(std::move(ar));
}
我得到的结果如下:
PKi
void fn(const T &&) [T = const int *]
PKi
我不明白的是为什么T
被推断为const int *
。为什么 const
没有匹配模式?
在参数声明 T const &&t
中,const
在 T
上限定,即 t
被声明为 rvalue-reference 到 const T
.
当传递 const int *
类型的 ar
时, T
被推导为 const int *
,那么 t
的类型将是 const int * const &&
,即 rvalue-reference 到 const
指向 const int
的指针。请注意,const
在不同的事物(在不同级别)上有资格,一种用于指针,一种用于指针。