CV 分解将类型“剥离”为交替的层const
/volatile
限定符和指针/数组间接寻址。如果指针/数组间接寻址相同(允许“未知边界的数组”与“未知数组的数组”匹配,则类型相似)n
") 并且下面的类型是否相同(忽略 cv 限定符)。
So,
// every type is similar to itself
template<typename T, typename U>
struct is_similar_impl : std::is_same<T, U> { };
// we don't care about cv-qualifiers
template<typename T, typename U>
struct is_similar : is_similar_impl<std::remove_cv_t<T>, std::remove_cv_t<U>> { };
// peeling off different kinds of pointers/arrays
template<typename T, typename U>
struct is_similar_impl<T*, U*> : is_similar<T, U> { };
template<typename C, typename T, typename U>
struct is_similar_impl<T C::*, U C::*> : is_similar<T, U> { };
template<std::size_t N, typename T, typename U>
struct is_similar_impl<T[N], U[N]> : is_similar<T, U> { };
template<std::size_t N, typename T, typename U>
struct is_similar_impl<T[N], U[]> : is_similar<T, U> { };
template<std::size_t N, typename T, typename U>
struct is_similar_impl<T[], U[N]> : is_similar<T, U> { };
template<typename T, typename U>
constexpr inline bool is_similar_v = is_similar<T, U>::value;
Godbolt 和测试用例 https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAM1QDsCBlZAQwBtMQBGAFlICsupVs1qhkAUgBMAISnTSAZ0ztkBPHUqZa6AMKpWAVwC2tQVvQAZPLUwA5YwCNMxENwAMpAA6oFhdbT1DE0FvXzU6Kxt7IycXd0VlTFV/BgJmYgJA41NOBJVw2lT0gki7R2cQAGYATkU0jKzg3IV6kusymIqagEpFVANiZA4AcilK62RDLABqcUqddRbiTGYjOexxNwBBMYmpzFn5petgdc2dyXHaSYMZuZ0CAE9PTAB9AmJmQgUz7fOAen%2B00wADdnI9pk8XtM8Appr4jHhhMRIagYQQlKwqOcCJgjJ5hLj7lCtKsDgAVUiQ56kowHACqvy2SwMqhhCleCKR6VeeHxrGmIHhBHQIBAsM5ZPulOmjMq2FmAHZpEqACJzWTbQHTADuB3QdDAwwI0xYy2mzAc/RNyBBAFoAI4GNh4Kh4Zw/ba4/nMInzEm0MnTGUBoNyjbbFlsiVc5GC9mcvnc4i8/n3FqikDLIyoMGvW3vaXrKkZsXZ3NvAsEe7h9ZKlXiRXqyqarbal7KE7TVBUKjTfC95xaE0Aa2s6DhPem3msuOICn%2B6U%2Bj09W29BN9mGJNMDdODVNDe9rkY%2BrJNMaTyNTBOlACoqfTb3WhRfEcjpQ%2B642G02NTi8RufoPDuQY6AeIF7iGEEMkyUbnhysY8nyN7zOS0w6GK96yuhmHPgmiHEB%2Bspfsqap/l6AGEluRwimKvgAF5vCatjgS8u4UqxtIwfK5xwfhl5IWmqHiAArNItiiaqn5iRJInNgqL4IQJhGoZ%2B8r1mRLb/j6QGliADFMdMLHUmxQZQaZR6wae0ZKW%2BgkoTo5KieJknSbIcl4a%2ByZEeGGmNs2rbrlR6a0fpeCMe8Rmcex%2B4mVxxE8SexBnvxdkpshrBFmJrnETJkmebZ3mqQlCrfpprbaYB1HARZHFxTFx5bGgtAtJgAAengotYrDtNMVr6KlyavCChyqoN77FeGYogmwBjURV2yztMRhfLQEDdPW5zTNtwqZmgBjVtsO3HYcOj3ONPIgvcs5UrOX7zOdUiSKJOi0E90zao8mCridO33OdXlXld8w3dMVCsKgvr3Wd8yzJIz0ia973arQqBbb9p0A4VQPXfQpp0C0t14yC%2Bi%2Bki1GlQ9sNPS9b3wx9QJfT9GP/bDgOXbjNoEwQVLg5DJok4S5PQ498O08jQKo%2Bjv2szoF0psDCz0FhS3NS0T7qbLcMI0j9Ofd90snVr7MK5zWF876GuUzDcs04jdOSAz0xS0dLNU3LJvDfcJN4Og0wQLe3QQLOgdUj7fsB0Havnsr3Qi9TYv2xLztohABrfSnJrMJ4BIQkQYMGNcBQWsQwDGMOChx67Mvu/LXsg3jemwh8KxGJhRMmnpPgt6suGa7Xdu647KOpzYmB%2B/nTiQggBwKEGkzMAoleG8dxvYxzDed6F3fLL3IBPmJCNSTCjfb0sre4dlHn9zb2vi3rjMG9XRu157isrxjqvcwHgtk%2BwEB6WOKITC0dpi/zUOwOOYlKiSSge5KSH9fpLXAeTAO0cAGhSAaAfecCYFyTgdwfKN9RY6wdk7JmiDMZs3XqbB6z8MYny5i1AgP9SYQMwBgzMWCQHczAWw8muDYHOREq5Shx1kH8P/redBgCPgnEwoI/BzlCHX2tiQ%2B%2Bz0WxO1Rv7JczAVzO0wOPVEfVZ5BgMlXHYTZhi9FYCAYYIlhikFMMMNwTjUD2LOjIOQ8J%2BiDAOGMTgTiCD2Lcd0XoI4QAADZqgADo3BRKiQADiiZIKJbhOBuEkCkqJQh7HcCcS4txpAPHDCcQoEAHgQmuJsaQOAsAkDtSSAdEg5BKDpGAAoAACiIZQDAECoB1C4oJpA0D4m5AUHpNhWD9MGUUpxYzPDkxcAvUQmS3AeEWcsgA8gdWZQzQlOKacgLYpcKllNIMc1I%2BAXFOJoPQJgbAOA8H4IIYQwCJDeJkEIPADgKmQF6KgTwBRzl2gAOpsAFHaDMcxVSfNkDITgipyl%2BKGIIDM1gpl9IGQc4YQTbH2Mcc4w5JT7FtRSXaKJ3BTTvOANMTJ8T4nTGwG1ZpRAUQQFwIQEgcNKicA2l4hF0hgmHPCaQGezAsAuHWqQSJlQ3CxOqJUPllRFQ1CSdURUnBKjcEqHk4YBTiU1NJRcipVTRUEuGJIQpJLSkipqWKsE85/CuCAA%3D%3D%3D