[简介]
常用网名: 猪头三
出生日期: 1981.XX.XX
QQ联系: 643439947
个人网站: 80x86汇编小站 https://www.x86asm.org
编程生涯: 2001年~至今[共22年]
职业生涯: 20年
开发语言: C/C++、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python
开发工具: Visual Studio、Delphi、XCode、Eclipse、C++ Builder
技能种类: 逆向 驱动 磁盘 文件
研发领域: Windows应用软件安全/Windows系统内核安全/Windows系统磁盘数据安全/macOS应用软件安全
项目经历: 磁盘性能优化/文件系统数据恢复/文件信息采集/敏感文件监测跟踪/网络安全检测
[序言]
今晚在折腾std::string_literals这个东西, 因为是C++11引入的一个称为"user-defined string literal"的新概念. 认真看了代码演示之后, 就觉得有瑕疵.
[C++11新概念][user-defined string literal]
下面看看这3行代码的区别,
第一种写法:
std::array<std::wstring, 2> colors {L"orange", L"yellow"} ;
第二种写法: 通过's'后缀标识, 进行std::string的隐式转换. 这里用了宽字符L, 所以隐式转换为std::wstring
using namespace std::string_literals;
std::array colors {L"orange"s, L"yellow"s} ;
客观说, 虽然说C++11引入"user-defined string literal"概念, 目的是方便各种类型隐式转换. 但是有一个弊端就是, 需要使用"using namespace std::string_literals"方式来简化写法. 为什么说是弊端呢? 因为在超级大项目中, 用using namespac的方式来避免过长的名字空间描述的时候, 会产生新的名字空间污染. 这是非常不好的写法. 后来, 我尝试写完整的限定名称, 结果发现这是很可笑的语法糖.
第三种写法: 虽然避免了名字空间的污染, 但是写法太累赘了.
std::array<std::wstring, 2> colors {std::string_literals::operator""s(L"orange", 6),std::string_literals::operator""s(L"yellow", 6)} ;
[结尾]
最终经过3种写法, 我还是喜欢第一种, 简单明朗.