問題タブ [user-defined-literals]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - ユーザー定義リテラルは、C++ にどのような新しい機能を追加しますか?
C++11では、既存のリテラル ( 、、、 )に基づいて新しいリテラル構文を導入できるユーザー定義リテラルが導入されているため、どの型でもリテラル表現を使用できます。int
hex
string
float
例:
一見これは非常にクールに見えますが、実際にどのように適用できるのか疑問に思っていました.接尾辞を付けて日付を作成しようとしたとき、_AD
演算子_BC
の順序のために問題があることがわかりました. 1974/01/06_AD
最初1974/01
に (プレーンなint
s として) を評価し、後で評価します ( 8 進数の理由06_AD
で、8 月と 9 月を なしで書かなければならないことは言うまでもありません)。これは、演算子の評価順序が機能するよう0
に構文を be にすることで回避できますが、扱いにくいです。1974-1/6_AD
要するに、私の質問はこれです。この機能はそれ自体を正当化すると思いますか? C++ コードを読みやすくするために、他にどのようなリテラルを定義しますか?
2011 年 6 月の最終ドラフトに合わせて構文を更新
c++ - C++11 のユーザー定義リテラル (拡張リテラル) ... どのコンパイラがサポートしていますか?
別のスレッドで、C++11 の機能、特にユーザー定義リテラルが利用可能になったら、C++ でのモデル駆動型開発に使用するいくつかの手法を紹介しました。GCC 4.5 および 4.6 の計画を改訂したところ、この特定の機能がサポートされていないことがわかりました。
とにかく、C ++ 11が承認され、主流の無料コンパイラ(LLVM、GCC)で実装されるまで、その機能をテストしてアルゴリズムの設計/実装を開始するコンパイラがあるかどうか知っていますか?
c++ - c++0x でのユーザー定義リテラルのオーバーロード規則
ルールのオーバーロードについて少し混乱していますが、
次のリテラル演算子があるとしましょう。
1、2、および 3 の両方が定義されている場合、オーバーロードは明らかです。
1 と 2 が定義されている場合、
2 と 3 が定義されている場合
混乱は、最新の c++0x 標準 n3225 2.14.8/3 に由来します。
L がユーザー定義の整数リテラルの場合、n を ud 接尾辞なしのリテラルとします。S に unsigned long long 型のパラメーターを持つリテラル演算子が含まれている場合、リテラル L は次の形式の呼び出しとして扱われます。
演算子 "" X (n ULL)
それ以外の場合、S には生のリテラル演算子またはリテラル演算子テンプレート (13.5.8) が含まれますが、両方は含まれません。S に生のリテラル演算子が含まれている場合、リテラル L は次の形式の呼び出しとして扱われます。
演算子 "" X ("n")
それ以外の場合 (S にリテラル演算子テンプレートが含まれる)、L は次の形式の呼び出しとして扱われます。
operator "" X <'c1', 'c2', ... 'ck'>()
ここで、n はソース文字シーケンス c1c2...ck です。
これは、1 が存在する場合 (unsigned long long パラメータ)、13_xx が 1 を呼び出し、それ以外の場合、13_xx が 2 を呼び出すことを示しています。
特に、それらは通常の関数や関数テンプレートのように検索され、同じオーバーロード解決規則に従います。
私の理解では、1 が存在しない場合、13_xx を暗黙的に double に変換して 3 を呼び出すことができます。
したがって、1 が存在しない場合、2 と 3 の両方が標準の説明から何らかの形で有効です。
誰かが私の疑問を解消するのを手伝ってくれることを願っています. どうもありがとう。
c++ - 標準で事前定義されているユーザー定義リテラルはどれですか?
私の質問は矛盾しているように聞こえますが、. 以外の新しいリテラル構文を参照する方法がわかりませんuser-defined-literal
。
_
ユーザー定義リテラルはプレフィックスで始める必要があると聞いたのを覚えています。これは、ライブラリが接頭辞のないリテラルをいくつか定義していることを意味します。
標準は、標準ライブラリでいくつかの UDL を提供しますか?
はいの場合、それらは何ですか?
c++ - ユーザー定義リテラルはコンパイル時または実行時に解決されますか?
ULL
、などの事前定義されたリテラルf
はコンパイル時に明らかに解決されるので、疑問に思います。標準(2.14.8 [lex.ext])はこれを定義していないようですが、実行時に向かう傾向があるようです。
[2.14.8 / 2]
ユーザー定義リテラルは、リテラル演算子またはリテラル演算子テンプレート(13.5.8)の呼び出しとして扱われます。ud-suffix Xを使用した特定のユーザー定義リテラルLに対するこの呼び出しの形式を判別するために、リテラルサフィックス識別子がXであるliteral-operator-idは、非修飾名ルックアップのルールを使用してLのコンテキストでルックアップされます( 3.4.1)。このルックアップで見つかった宣言のセットをSとします。Sは空であってはならない。
(私の強調。)
13.37f
ただし、私には、これは不要なランタイムオーバーヘッドをもたらすように思われます。リテラルは、または"hello"_x
(_x
ユーザー定義リテラルはどこにあるか)のように、コンパイル時に使用可能な値にのみ追加できるためです。
次に、テンプレート化されたuser-defined-literalを取得しました。これは、標準のAFAICSでは実際には定義されません(つまり、例は示されていません。間違っていることを証明してください)。その関数はコンパイル時に何らかの形で魔法のように呼び出されますか、それともまだ実行時ですか?
c++11 - ユーザー定義のリテラル接尾辞、*_digit..."?
C++0xのユーザー定義リテラル サフィックスは、次の識別子にする必要があります。
- (アンダースコア)で始まる
_
(17.6.4.3.5) - 大文字
で始めてはいけません(17.6.4.3.2)
_
[...] がアンダースコアで始まり、その後に大文字が続く各名前は、実装で使用するために予約されています。
_
そのようなサフィックスの後に数字が続かない理由はありますか? または?_4
__3musketeers
c++ - C++0x、フレンド演算子 ""() を使用したユーザー定義リテラル
operator "" (...)
をフレンド関数として定義することは可能かつ/または有用ですか?
名前空間でのみ定義されるルールのため、特に「有用」について考えています。特に、でoperator ""
始まる識別子_
はグローバル名前空間で予約されているためです。これはfriend
ここでこの規則に違反していますか? ですから、このカプセル化が不十分であることに何のメリットもありませんよね?
c++ - ユーザー定義リテラルは引数として関数を持つことができますか?
関数はユーザー定義のリテラルで使用できますか?
もしそうなら、どのようなシェナニガンを行うことができますか?これは合法ですか?
c++ - ユーザー定義のリテラル引数は constexpr ではありませんか?
ユーザー定義リテラルをテストしています。_fac
数値の階乗を返すようにしたい。
関数を呼び出すことはconstexpr
機能しますが、引数が ではなく、 ではないとコンパイラが不平を言うため、テンプレートでそれを行うことはできませんconstexpr
。
私はこれに混乱しています - リテラルは定数式ではありませんか? 5
in5_fac
は常にコンパイル時に評価できるリテラルですが、なぜそれをそのまま使用できないのでしょうか?
最初の方法:
2 番目の方法: