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!
喜欢就支持一下吧
打赏
微信
微信