問題タブ [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++ - リテラル演算子テンプレート: 文字列ではないのはなぜですか?
繰り返しますが、別の質問に回答しているときに、整数または浮動リテラルが見つかった場合にのみ、宣言のセットからリテラル演算子テンプレートが選択されることを忘れていました (私のせいです)。
例として:
として使用できますが、としても "foo"_x10_x
としても使用できません。foo_x
標準がそれを言っているという明白な理由は別として、文字列リテラルを扱うときにそれらが考慮されない技術的な理由(もしあれば)は何ですか?
私はそのための提案も見つけました(まあ、まったく同じではありませんが、アイデアが得られます)が、それでもそれはオプションではありません.
それらを文字列に使用できない理由は何ですか?
c++ - ユーザー定義のリテラルで C++14 の桁区切り記号を使用できますか?
clang は次の行をコンパイルしますが、g++ 6.1 は桁区切り記号について不平を言います ( Coliru のライブ例を参照)。
C++14 標準 (N3796) に従って正しいコンパイラはどれですか?
それ以外の場合、桁区切り記号 (§2.14.2) は、<chrono>
ライブラリ (§20.12.5.8) のユーザー定義リテラル (§2.14.8) の実装の詳細にすぎませんか? unsigned long long
これらのリテラルはパラメーターで定義されているため、私見ではありません。
Howard HinnantがCppCon 2016 のトーク "A tutorial" (トークの約 42 分) で10'000s
例として使用したことを覚えています。<chrono>
( 8 進リテラル 0123 は 64 + 16 + 3 == 83 であるため、 「1 分 23 秒」をコード化するつもりはなかったことに注意してください。これは偶然に正しいだけです。その目的のために、次のように記述します。
しかし、その誤解を招く可能性のある解釈は問題の一部ではありません.)
c++ - ユーザー定義リテラルは桁区切り記号とどのように連携しますか?
可変個引数テンプレートによって解析されたユーザー定義のリテラルに桁区切り記号を追加することで、コードの古い例を変更したところです。
g++6.2.0で をインスタンス化しようとしたとき、私は驚きましたbin<'\''>
。それは私のテンプレートに'
as aを渡そうとしました! 同じ苦情でclang++-3.9とmsvc++-19.00を試してみましたが、本当に懐疑的です。char
template<char...CS> int operator"" _bin()
それは正しい行動ではないかもしれないと感じています。私のリテラルが引用符で囲まれていれば理解できたでしょうが"1000'0000"_bin
、このフォームはテンプレート演算子 "" には存在しませんよね?
'
テンプレートのユーザーリテラル演算子にも桁区切り記号が必要ですか?
更新 1:問題がない場合'
:
あらゆる種類のもの、たとえば複素数の sep として digit-sep を使用できます。52.84+67.12iに対する「52.84'67.12_i' の動作は明確に定義されていますか?」
Udpdate 2:いくつかのコメントの反応として。以下がコンパイルされます。
出力は次のとおりです。
これは、テンプレートがすべての文字を取得することを意味します: 接頭辞と桁区切り文字 - それらすべて。(g++-6.2.0)
@krzaqの答えが示唆するように、これはStdの計画であるように見えるので、それに頼ることができます。
c++ - 任意の型の C++ ユーザー定義リテラル
現在のところ、ユーザー定義のリテラルは、限られた型のセットを入力パラメーターとして受け入れます (こちらを参照)。入力パラメーターとして任意の型を受け入れる計画はありますか?そうでない場合、それはなぜですか?
たとえば、std::chrono::duration を異なる形式 (秒、ミリ秒など) で取得できるようにしたい場合は、次のようにします。
c++ - [std::operator""s] を名前空間で見えるようにする方法は?
エラーメッセージは次のとおりです。
エラー : タイプ 'unsigned long long' または 'const char *' の引数を持つ 'operator""s' の呼び出しに一致するリテラル演算子がなく、一致するリテラル演算子テンプレートもありません std::chrono::seconds d = 0s;
私の質問は:
use namespace std;
入りたくありませんnamespace Y
。では、どのようにstd::operator""s
見えるようにすればよいnamespace Y
ですか?
c++ - 予約済み識別子を使用する場合、using コマンドは警告を発行する必要がありますか?
回線を利用する場合
g++ 6.3.0 では、コンパイラは次のような警告を発行します。
警告: 「_」が前に付いていないリテラル演算子サフィックスは、将来の標準化のために予約されています
MSVS でも同様の警告が発行されます。ただし、clang 3.8.0 ではそのような警告は発行されません。
は chrono ライブラリの標準で定義されているためoperator""s
、名前を定義するのではなく名前をインポートするだけなので、これは警告を出すべきではありませんか?
c++ - ユーザー定義リテラルをテンプレート化できますか?
いくつかのクラスがあるとします:
Foo
そして、オブジェクトを作成するユーザー定義のリテラルをいくつか提供します。
私の質問は次のとおりです。これらをテンプレート化して、コードを書き直す必要がないのはなぜですか?
gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.4) および 7.0.0 (自分でコンパイル) レポート:
エラー メッセージは十分に明確に見えますが、原則としてこれを許可してはならない理由がわかりません。それで、私はこれを間違ってやっていますか、それとも本当に許可されていませんか?