問題タブ [conversion-operator]

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.

0 投票する
3 に答える
555 参照

c++ - C++ オーバーロードの解決、変換演算子、および const

この場合

状況はかなり明確です - f(int *) が呼び出されますが、これは正しいようです。

しかし、私がこれを持っている場合(間違ってそのように行われました(*)):

operator char *() が呼び出されます。そのような決定パスが、演算子 bool() に行くよりも優れている理由がわかりません。何か案は?

(*) const を 2 番目の演算子に追加すると、コードは当然期待どおりに機能します。

0 投票する
2 に答える
318 参照

c# - Nullable の IL の生成連載?

[de]serialization コードを生成するために IL を発行する独自のシリアライザーを作成しています。

nullables の場合、次を生成できると思いint?ました (ex として取得) ( [de]serialize のメソッドを既に生成していると仮定しますint):

これを生成する方法は次のとおりです。

デバッグ用のアセンブリも生成します。それを ILSpy にロードすると、C# コードは私が考えていたものとまったく同じように見えます。しかし、peverifyには他に言いたいことがありました...

ここに画像の説明を入力

しばらく考えた後、それが構造体であることに気付いたので、代わりにNullable<T>使用する必要があるので、に変更しましたLdargaLdargldarg_1()ldarga(1)

これで peverify は次のようになります:

Nullable<T>変換演算子と関係があると思ったので、Valueプロパティを試しました:

peverify はこれに満足しています。

問題は、 nullable を基になる型にキャストするときに、明示的な演算子 from が以前に開始されTなかったのはなぜですか?Nullable<T>

Ldargaまた、実行するときではなく使用するLdargときでも、Deserialize のエラーを取り除くことができませんでしたvalue = tmp;。暗黙の変換が何をしているのかを試すことができたと思います。つまりvalue = new Nullable<int>(tmp);、何が間違っていたのかを知りたいのです。

注: 「emit」は、IL を生成するために使用する単なるヘルパーです。内部でを使用し、ILGenerator各操作の後にそれ自体を返すので、呼び出しを連鎖させることができます。

編集:これは、メモとすべてを含む、機能した最終的なコードです。

0 投票する
3 に答える
598 参照

c++11 - Clang 3.5 と 3.6 の間のオーバーロード解決のこの変更は正しいですか、それともバグですか?

以下のコードは、Visual Studio 2013、gcc 4.8、clang 3.4、および clang 3.5 (Apple LLVM 6.0) でコンパイルされますが、clang 3.6 (Apple LLVM 6.1 経由) ではコンパイルされません。

このコードは、コードベースの複雑なクラスの簡略化されたバージョンであり、問​​題を示すために最低限必要なものです。

問題の核心は、 ;を受け入れるコンストラクターが存在するためTYPED_VALUE、3.6 では、のコピー構築がテンプレート化された型の変換演算子を評価することです。これによりが評価され、 の定義が必要になります(ここでは提供できません - 完全なコードでは循環依存が発生します)。STRINGSTRINGstd::is_constructibleSTRING

エラーメッセージは

私には、これは 3.6 のバグのように思えます。以前のバージョンでは、オーバーロードの解決により、テンプレート引数を評価することなく、コピー コンストラクターが最適であると判断されました。私にもっと;)

(これは、コンストラクターまたは変換演算子のいずれかを明示的にすることで修正できますが、それは私たちが望む動作ではありません)

答えを知っている標準的な専門家はいますか?

0 投票する
1 に答える
59 参照

c++ - テンプレート化された変換演算子のガイド宣言

次のようなものを検討してください。

コード/コピーと貼り付けの重複を避けるために、テンプレート化された演算子を使用して一連の可能な変換を指定したいと考えています。ただし、もちろん、コードのコメント行のような一連の変換は機能しません。これは、C++ では、コンパイラがテンプレート化された演算子のすべての形式を合理的に考慮しないためです。

代わりにカット アンド ペーストを選択し、Bar を次のように定義するとします。

これで、連鎖変換を決定して見つけることができます。私が望むのは、ケーキを食べて食べることができるようにすることです。特に、演算子をテンプレートとして定義するだけでなく、変換演算子が非テンプレートとして定義されているかのように使用できる一連のガイド宣言も提供します。

C++11/C++14 でこれを達成する方法はありますか? 変換演算子の定義の複製を持たずに、変換演算子のインスタンス化の有限セットを個別に定義されているかのように使用できるようにするコードを構造化するための提案はありますか?

0 投票する
3 に答える
285 参照

c++ - クラス テンプレートの変換演算子

2 つのクラス テンプレートTemplateA<T>TemplateB<T>. ここで、 からへのTemplateB<T>暗黙的な型変換を可能にするために、変換演算子を定義したいと思います。ただし、次のコードではコンパイル エラーが発生します。TemplateB<T>TemplateA<T>

エラー:

0 投票する
1 に答える
376 参照

c++ - 変換演算子の継承について混乱しています

次のプログラムを検討してください: (ここでライブデモを参照してください。 )

プログラムの出力は次のとおりです。

9

9

ここでは、クラスの変換演算子をBase継承しているため、m変数の初期化は有効です。

sしかし今、Derived に属するデータ メンバーの値を出力したいと思います。これどうやってするの?

派生クラスの変換演算子も書き換える必要があるのでしょうか? 同じBaseクラス変換演算子を再利用できませんか?