問題タブ [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.
c++ - C++ オーバーロードの解決、変換演算子、および const
この場合
状況はかなり明確です - f(int *) が呼び出されますが、これは正しいようです。
しかし、私がこれを持っている場合(間違ってそのように行われました(*)):
operator char *() が呼び出されます。そのような決定パスが、演算子 bool() に行くよりも優れている理由がわかりません。何か案は?
(*) const を 2 番目の演算子に追加すると、コードは当然期待どおりに機能します。
c# - Nullable の IL の生成連載?
[de]serialization コードを生成するために IL を発行する独自のシリアライザーを作成しています。
nullables の場合、次を生成できると思いint?
ました (ex として取得) ( [de]serialize のメソッドを既に生成していると仮定しますint
):
これを生成する方法は次のとおりです。
デバッグ用のアセンブリも生成します。それを ILSpy にロードすると、C# コードは私が考えていたものとまったく同じように見えます。しかし、peverifyには他に言いたいことがありました...
しばらく考えた後、それが構造体であることに気付いたので、代わりにNullable<T>
使用する必要があるので、に変更しましたLdarga
Ldarg
ldarg_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
各操作の後にそれ自体を返すので、呼び出しを連鎖させることができます。
編集:これは、メモとすべてを含む、機能した最終的なコードです。
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 では、のコピー構築がテンプレート化された型の変換演算子を評価することです。これによりが評価され、 の定義が必要になります(ここでは提供できません - 完全なコードでは循環依存が発生します)。STRING
STRING
std::is_constructible
STRING
エラーメッセージは
私には、これは 3.6 のバグのように思えます。以前のバージョンでは、オーバーロードの解決により、テンプレート引数を評価することなく、コピー コンストラクターが最適であると判断されました。私にもっと;)
(これは、コンストラクターまたは変換演算子のいずれかを明示的にすることで修正できますが、それは私たちが望む動作ではありません)
答えを知っている標準的な専門家はいますか?
c++ - テンプレート化された変換演算子のガイド宣言
次のようなものを検討してください。
コード/コピーと貼り付けの重複を避けるために、テンプレート化された演算子を使用して一連の可能な変換を指定したいと考えています。ただし、もちろん、コードのコメント行のような一連の変換は機能しません。これは、C++ では、コンパイラがテンプレート化された演算子のすべての形式を合理的に考慮しないためです。
代わりにカット アンド ペーストを選択し、Bar を次のように定義するとします。
これで、連鎖変換を決定して見つけることができます。私が望むのは、ケーキを食べて食べることができるようにすることです。特に、演算子をテンプレートとして定義するだけでなく、変換演算子が非テンプレートとして定義されているかのように使用できる一連のガイド宣言も提供します。
C++11/C++14 でこれを達成する方法はありますか? 変換演算子の定義の複製を持たずに、変換演算子のインスタンス化の有限セットを個別に定義されているかのように使用できるようにするコードを構造化するための提案はありますか?
c++ - クラス テンプレートの変換演算子
2 つのクラス テンプレートTemplateA<T>
とTemplateB<T>
. ここで、 からへのTemplateB<T>
暗黙的な型変換を可能にするために、変換演算子を定義したいと思います。ただし、次のコードではコンパイル エラーが発生します。TemplateB<T>
TemplateA<T>
エラー:
c++ - 変換演算子の継承について混乱しています
次のプログラムを検討してください: (ここでライブデモを参照してください。 )
プログラムの出力は次のとおりです。
9
9
ここでは、クラスの変換演算子をBase
継承しているため、m
変数の初期化は有効です。
s
しかし今、Derived に属するデータ メンバーの値を出力したいと思います。これどうやってするの?
派生クラスの変換演算子も書き換える必要があるのでしょうか? 同じBase
クラス変換演算子を再利用できませんか?