C++11——用户定义字面值
C++ 03:
字符“12.5”能被编译器解释为数值为12.5的double
类型字面值,但是添加后缀f
例如12.5f
将创建一个float
类型的值。数字的后缀修饰符是由C++规范固定的,C++ 03不能创建新的字面修饰符。
C++ 11:
C++ 11使用户能够定义新的字面修饰符,利用自定义的修饰符完成由字面值构造对象。
字面值转换可以定义为两个阶段:原始和转换后。原始字面值指特定类型的字符序列,而转换后的字面值则代表另一种类别。如字面值1234,原始字面值是‘1’,‘2’,‘3’,‘4’的字符序列,转换后的字面值是整数值1234。另外,字面值0xA转换前是序列‘0’,‘x’,‘A’,转换后代表整数10。
所有用户定义的字面值都是后缀,无法定义前缀字面值。标准保留除下划线_
以外任何字符开头的所有后缀,因此,所有用户定义的字面值必须具是下划线_
开头的后缀。
用户定义字面值通过字面值运算符 operator ""
。
long double operator"" _mm(long double x) { return x / 1000; }
long double operator"" _m(long double x) { return x; }
long double operator"" _km(long double x) { return x * 1000; }
cout << 1.0_mm << endl; //0.001
cout << 1.0_m << endl; //1
cout << 1.0_km << endl; //1000
根据C++ 11标准,只有下面参数列表是合法的:
char const *
unsigned long long
long double
char const *, size_t
wchar_t const *, size_t
char16_t const *, size_t
char32_t const *, size_t
最后四个对于字符串相当有用,第二个参数会自动推断为字符串的长度 :
size_t operator"" _len(char const * str, size_t size)
{
return size;
}
cout << "mike"_len <<endl; //4
对于参数char const *,应该被称为原始字面值操作符,不要同字符串混淆:
char const * operator"" _r(char const* str)
{
return str;
}
cout << 25_r <<endl; //25
字面值的返回值并没有被严格限定。