STD :: String用の標準定義されたリテラル接尾辞がない理由
-
21-12-2019 - |
質問
クイック質問:C ++ 11では、
などのstd::string
を作成するためのリテラルを定義した「ユーザー - 」(実際、標準ライブラリ)を提供するのはなぜですか。
auto str = "hello world"s; // str is a std::string
.
C ++のように、Objective-CはCスタイルの文字列とよりユーザーフレンドリーなライブラリ型NSString
をサポートしています。ただし、C ++とは異なり、NOWは2つの間に混同されていません。実際、Literal ががNSString
プレフィックスを持っている場合は、Objective-Cコードを見ることは稀です。誰もがそれがそれをする方法であることを知っているだけで、@
を使用してそれをオンにします。
C ++ 11ユーザ定義リテラルはこれを許可し、実際にStroustrupのC ++ 11 FAQのUDLセクションはこの例を正確に使用します。さらに、主要なアンダースコアなしのUDLは予約されているので、上記のように平野@
を可能にするのに問題はないでしょう - それが他のものと衝突する可能性はありません。
おそらく私は何かが足りないように見えますが、言語への非常に貴重で危険な無効な追加になるようですので、なぜC ++ 11がそれを提供していない理由も知っていますか? C ++ 14に表示される可能性がありますか?
解決
ユーザー定義リテラルは、これが含まれていないことをC ++ 11で十分に新しいものでしたが、C ++ 14(誰かがいない場合は§21.7では)です。そして、s
をサフィックスとして使用します。正確な結果の種類は文字列リテラルの種類によって異なります - 「狭い」リテラルはstd::string
を与える、U16リテラルはu16string
を与え、U32リテラルはu32string
を与えます。ああ、ええ、あなたが広い文字列リテラルを使用することを主張するならば、それはwstring
を生成します。
s
サフィックスも秒(<chrono>
で定義されている)にも使用されますが、文字列リテラル上の2つのs
との間に実際の競合はありません。