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

字面值的返回值并没有被严格限定。

原文链接: https://www.cnblogs.com/w1ng/p/13033241.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++11——用户定义字面值

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/352387

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午7:30
下一篇 2023年3月2日 上午7:30

相关推荐