問題タブ [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++11 ユーザー定義リテラルで最小の変数を取得する方法
私は C++11 のいくつかの新機能を調査してきましたが、それらのいくつか、特にユーザー定義リテラルに非常に感銘を受けました。
これらにより、リテラルを生成するために何を行うかを制御する999_something形式のリテラルを定義できます。したがって、次を使用する必要はもうありません。something999
1_000_000_blahPerlの可読性に匹敵するように、アンダースコアを多数実装するのはいいことだと思っていました.
1101_1110_bや などのバイナリ値にも便利です0011_0011_1100_1111_b。
明らかに_文字のため、これらは C 文字列を処理する raw モード タイプである必要がありますが、私はそれで問題ありません。
私が理解できないのは、オペランドのサイズに基づいて異なる型を提供する方法です。例えば:
(もちろん8ビットであるとchar仮定して)を与える必要があります:char
16 ビット タイプを提供します。
リテラル演算子関数自体からオペランドの長さを取得できますがoperator""(数字の文字を数えることによって)、戻り値の型は関数に固定されているように見えるため、これに基づいて別の型を返すことはできません。
これは、ユーザー定義型フレームワーク内の単一のサフィックスで実行できますか?それとも、_b手動で型を分割して (_b8など_b16)、ほとんど重複した機能を提供する必要がありますか?
c++ - c++11 のユーザー定義リテラル、コンパイル/実行の二分法と競合する
ISO C 標準は、翻訳動作と実行動作を分離することについて重要な役割を果たしていることを知っています。これは、クロスコンパイラがすべてのターゲットの実行環境を実行する必要がないようにするためでもあります。
つまり、実行中のプログラムと比較して、コンパイラが利用できる情報が限られているということです。これにより、次のような関数からの戻り値に基づいて変数を初期化しないなど、ソース コードで実行できることが制限されます。
私が興味を持っているのは、C++11 のユーザー定義リテラルがこのスキームにどのように適合するかです。リテラル評価は関数に依存しているため、その関数が次のようなことを行うのを止めるにはどうすればよいですか:
42_roughlyランダムな値を返しますか ( 40 から 44 の間の値を与えるなどの入力に基づいている場合でも)?- グローバル変数の変更などの副作用がありますか?
関数を呼び出さなければならないという事実は、これらがコンパイル時に計算されるという意味で実際にはリテラルではないことを意味しますか?
その場合、これらのリテラルが他の関数呼び出しよりも優れている点は何ですか。言い換えれば、その理由は次のとおりです。
より好ましい:
?
c++ - C++11 ユーザー定義リテラル
私は C++11 を学んでおり、ユーザー定義リテラルに興味があります。それで、私はそれで少し遊ぶことにしました。一部の言語には、次のような構文があります。
この機能を C++11 でシミュレートしようとしました。
しかし、一般的なケースでは、シミュレートできませんでした。
auto general_case = 123_456_789; //コンパイルできません
私の質問は、「C++11 を使用して、上記の一般的なケースをシミュレートできますか?」です。
c++ - コンパイル時の basic_string リテラルは高速ですか、それともより適切に処理されますか?
C++14/C++1y (n3690) の草案にざっと目を通していると、セクション §21.7 でbasic_stringリテラル接尾辞が導入されていることに気付きました。
私の質問は次のとおりです。
basic_stringリテラルを使用すると、実行時に高速になる可能性はありますか?- 私の「素朴な」実装は完全に間違っていますか?
- ROM 内のデータのレイアウトは、
basic_stringリテラルで異なる可能性がありますか、またはコンパイル時と実行時のその他の違いはありますか?
バックグラウンド
これにより、次のような文字列リテラルを直接使用できることがわかっています。
しかし、変換コンストラクター に依存することの利点は何string(const char*)ですか?
「古い」コードは次のようになります。
私が見る限り、の実装operator "" s()は基本的に次のようになります。
つまり、同じc'torを使用するだけです。そして私の推測では、それは実行時に行われなければならないということですが、私は間違っていますか?
編集:Nicol Bolasが私の例の下で正しく指摘したように、同じコンストラクターを使用していませんが、追加の長さを持つコンストラクターを使用しています。これは明らかに、構築に非常に役立ちます。これは私に疑問を残します: これは、コンパイラが文字列リテラルを ROM に入れること、またはコンパイル時に同様のものを入れることよりも良いですか?
c++ - ユーザー定義リテラルとメソッド呼び出しの組み合わせ
なぜこのようなコードを書くことができないのか疑問に思っています:
GCC 4.8.1 と Clang 3.4 の両方が、括弧で囲まoperator"" _km.to_milesないとリテラル演算子が見つからないと文句を言います。27_km
標準のセクション 2.14.8 を読んだところ、UDL サフィックスにピリオドを含めることはできないのに、なぜコンパイラはこのようにコードを解析するのでしょうか? それらは正しいですか、それともバグですか?
編集: 完全な例 (さまざまな UDL とメソッド名) をここで見ることができます: http://ideone.com/rvB1pk