C++常数后缀

看到一段代码.

 
template<class T, int shift, int size, class U>
class BitFieldBase {
 public:
  static const U kOne = static_cast<U>(1U);
  ...
};
 

第一眼将1U中的U看成了模板类型参数, 常数后面跟一个模板参数类型这种用法不常见.

再写一个测试的模板.

 
template<class T>
class MyTemplate {    
public:
    static const T k = static_cast<T>(1T);    
    static T get() { return k; }
};
 

结果报错"bad suffix".

1后面的U是常数后缀, 而不是模板类型参数, 正确写法.

 
template<class T>
class MyTemplate {    
public:
    static const T k = static_cast<T>(1U);    
    static T get() { return k; }
};
 

C++中即使常数也有类型, 如果没有后缀, 则由编译器决定, 相当于隐式类型, 如果不希望编译器指定类型, 则可以通过添加后缀来指定.

如果有三个重载函数,

 
int f(int);
unsigned int f(unsigned int);
long int f(long int);
 

对于f(10), 被调用的函数是. int f(int). 因为编译器为常数指定了int 类型.