オーバーロードされた関数がありますが、テスト コードでいくつかのエラーが生成されます。
inline void tt(uint8_t& v) { }
inline void tt(int8_t& v) { }
inline void tt(char& v) { }
inline void tt(uint16_t& v) { }
inline void tt(int16_t& v) { }
inline void tt(uint32_t& v) { }
inline void tt(int32_t& v) { }
inline void tt(uint64_t& v) { }
inline void tt(int64_t& v) { }
int main(int argc, char* argv[]) {
unsigned char t1;
signed char t2;
unsigned short t3;
short t4;
unsigned int t5;
int t6;
unsigned long t7;
long t8;
char t9;
tt(t1); // ok
tt(t2); // ok
tt(t3); // ok
tt(t4); // ok
tt(t5); // ok
tt(t6); // ok
tt(t7); // error
tt(t8); // error
tt(t9); // ok
}
(unsigned) long 以外はすべて機能するのはなぜですか? 標準的なlongを見ると、少なくとも (他のすべてのタイプと同様に) 32 ビットです。
There are five standard signed integer types: “signed char”, “short int”, “int”, “long int”, and “long long int”. In this list, each type provides at least as much storage as those preceding it in the list.
挿入することでこれを回避できます
inline void tt(unsigned long int& v) { }
inline void tt(long int& v) { }
コードに。このキャストが機能しない理由を知りたいだけです。