#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 *>::valuetrue

#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);
}

没有 T * 形式的推导的时候,T & 会推导为 char (&)[13]std::is_same<T &, char &>::valuefalse

#include <iostream>

template<typename T>
size_t foo(T param) {
    return sizeof(param);
}

template<typename T>
size_t foo(T &param) {
    return sizeof(param);
}

int main() {
    char arr[2]; 
    std::cout << foo(arr) == sizeof(arr);
}

此处 foo(T param) 会推导为 foo(char *param)foo(T &param) 会推导为 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>::valuefalse

#include <iostream>
#include <type_traits>

extern char arr[];

template<typename T>
bool foo(T &param1, 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)>::valuefalse

文章作者: Liccsu
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Liccsu's blog
喜欢就支持一下吧
打赏
微信 微信