[簡介]
常用網名: 豬頭三
出生日期: 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種寫法, 我還是喜歡第一種, 簡單明朗.