C++数组退化问题
#include <iostream>
#include <type_traits>
template<typename T>
bool foo(T *param) {
return std::is_same<T *, char *>::value;
}
int main() {
char arr[]{"Hello, World!"};
std::cout << foo(arr);
}
基本的数组退化现象,param
的类型为 char *
,T *
会推导为 char *
,std::is_same<T *, char *>::value
为 true
。
#include <iostream>
#include <type_traits>
template<typename T>
bool foo(T ¶m) {
return std::is_same<T &, char &>::value;
}
int main() {
char arr[]{"Hello, World!"};
std::cout << foo(arr);
}
没有 T *
形式的推导的时候,T &
会推导为 char (&)[13]
,std::is_same<T &, char &>::value
为 false
。
#include <iostream>
template<typename T>
size_t foo(T param) {
return sizeof(param);
}
template<typename T>
size_t foo(T ¶m) {
return sizeof(param);
}
int main() {
char arr[2];
std::cout << foo(arr) == sizeof(arr);
}
此处 foo(T param)
会推导为 foo(char *param)
,foo(T ¶m)
会推导为 foo(char (&)[2])
,这里是相同优先级的转换,导致重载决议冲突,无法编译。
#include <iostream>
#include <type_traits>
template<typename T, typename U>
bool foo(T param1, U param2) {
return std::is_same<T, U>::value;
}
int main() {
char arr[]{"Hello, World!"};
const char *str = "Hello, World!";
std::cout << foo(arr, str);
}
arr
的类型为 char[13]
,退化得到的是 char *
,str
的类型为 const char *
,std::is_same<T, U>::value
为false
。
#include <iostream>
#include <type_traits>
extern char arr[];
template<typename T>
bool foo(T ¶m1, char param2[]){
return std::is_same<T, decltype(param2)>::value;
}
int main() {
std::cout << foo(arr, arr);
}
char arr[] = "Hello, World";
此处 arr
是 unbounded array,param1
的类型会推导得到数组的引用,T
是数组类型,而 param2
是指针类型, std::is_same<T, decltype(param2)>::value
为 false
。
本文链接:
/archives/xmn1eoNx
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
Liccsu's blog!
喜欢就支持一下吧
打赏
微信