c++支持多种内置类型的字面量,比如:

123u // unsigned int
1.0 // double
1.6f // float
'a' // char
4ULL // unsigned long long
"as" // c-stype string

而c++11支持为内置类型提供新的自定义字面量的形式,比如:

“Hi!”s // std::string
1.2i // imaginary of Complex
10110000b // binary
10s // 10 seconds
100.0km // kilometers
12345678901234567890123456789x // extentend-precision

这种形式是通过重载operator ""(双引号)后缀运算符实现的(称为literal operator,字面量运算符)。举例说明:

	string operator""s(const char * sz, size_t n)
{
return string{sz, n};
} constexpr complex<double> operator""i(double d)
{
return {0.0, d};
}

上面代码定义了后缀s和i的重载形式。可以使用下面代码测试:

	auto cp = 1.6i;
auto str = "test literal"s;

这种形式的后缀重载可以使用任意标准未规定的后缀,但是不能重载或重定义已经使用的后缀形式,比如前面提到的d、u、f、l等后缀。operator""支持四种格式的重载:

  • 整型字面量

重载literal运算符时使用unsigned long longconst char *、或者模板literal运算符,比如:123m,1234567890123456789x。

  • 浮点型字面量

重载literal运算符时使用long doubleconst char *、或者模板literal运算符,比如:10.0s, 4567.891234567x。

  • 字符串字面量

重载literal运算符时使用(const char*, size_t)参数,比如:"string"s, "Foobar"_path。

  • 字符

重载literal运算符时使用char, wchar_t, char16_t, char32_t参数,比如: 'f'_runic, u'BEEF'_w。

注意c++标准规定保留所有非下划线开头的字面量后缀形式,重载literal运算符时建议使用下划线开头

如果使用了非下划线开头的literal运算符重载形式,在GCC编译器中也会有警告信息。

c++11中提供literal运算符的重载形式,给字面常量的处理带来很大的便利性和可定制化处理,比如可以在c++中支持任意进制的数据输入、支持大数处理(不用通过先保存为字符串,然后预处理的机制)等。

附加说明

如果有其他描述不清楚的地方,建议参考《c++11标准》或者TCPL ch12.2.5。

所有代码都在gcc(W64)的版本中编译测试过,相关源码可以从我的git下载,url如下:https://git.oschina.net/Tocy/SampleCode.git ,位于c++11目录下的cpp_user_def_literal.cpp文件中。

最新文章

  1. GUI
  2. POJ 2407 (欧拉函数)
  3. iBATIS.net获取运行时sql语句
  4. sssssssss
  5. 参考_Android中,如何新建一个界面,并且实现从当前界面切换到到刚才新建的(另外一个)界面
  6. iPerf - The network bandwidth measurement tool
  7. 实战FFmpeg编译支持arm64(转)
  8. Office365 InfoPath 表单的设计和应用(原创)
  9. HDU 3501 Calculation 2(欧拉函数)
  10. 修改host文件的P处理
  11. [LeetCode299]Bulls and Cows
  12. json.net 比jsonIgnore 更好的方法 修改源码
  13. Hiberbate中的一对多关联查询
  14. MySQL数据库Raid存储方案
  15. HTML知识点总结之表单元素
  16. WebDNN:Web浏览器上最快的DNN执行框架
  17. python 中内存释放与函数传递numpy数组问题
  18. Spring in Action 第一章 Spring之旅
  19. 将二维list某列组成新的list
  20. SQL Server进阶 SQL优化

热门文章

  1. Alamofire使用报错Extra argument &#39;method&#39; in call解决办法
  2. 【总结 】550,535,553 Mail from must equal authorized user— jenkins(hudson) email163邮箱和26邮箱成功配置总结
  3. O&#39;Reilly总裁提姆-奥莱理:什么是Web 2.0
  4. 树莓派进阶之路 (024) - windows远程桌面连接树莓派通过xrdp服务(转)
  5. Android----Thread+Handler 线程 消息循环(转载)
  6. int和Integer之间的区别和联系
  7. golang 学习笔记 ---内存分配与管理
  8. mysqldump脚本crontab执行失败,但是手动执行成功
  9. API设计原则
  10. com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1169 &gt; 1024)