問題タブ [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++ - ラムダの明示的なユーザー定義変換演算子
ラムダ関数に特化した記事ClosureType::operator ret(*)(params)()
で、特にその. この記事では、オペレーターは「汎用のキャプチャレス ラムダ ユーザー定義変換関数テンプレート」と呼んでいました。
コードが与えられた場合 (適切な型の関数ポインターへの自動変換):
#if 0
コードの関数の場合to_function_pointer
、ラムダを対応する関数ポインターに変換できません。explicit
言及された演算子がキーワードによって「暗黙的に」マークされているということですか? 規格に対応する条項はありますか?
c++11 - clang++ は失敗しますが、代入で const-unrelated-type 演算子へのキャストを使用すると g++ は成功します
これは、clang のレモンでこの「実行可能な変換なし」を再現する短い例ですが、コンパイラの動作の g++ の違いには有効です。
ゴッドボルトに住む
g++ (4.9、5.2) はそれを黙ってコンパイルします。一方、clang++ (3.5、3.7) はそれをコンパイルします
もしも
また
使用されますが、デフォルトでは使用され ません
その場合、clang++ (3.5) のせいa = b
:
2011¹標準を参照して: デフォルトのコードを拒否することについてclang ++は正しいですか、それともそれを受け入れることについてg ++は正しいですか?
注: これは、の修飾子が意味を成すかどうかの問題ではありません。これは、どのコンパイラが標準に準拠して動作するかについてであり、それについてのみです。const
cast_type
¹ 2014 年はここで違いを生むべきではありません。
編集:
これを汎用の c++ タグで再度タグ付けすることはお控えください。私はまず、どの動作が 2011 規格に準拠しているかを知りたいと思います。そして、委員会の献身not to break existing (< 2011) code
を今のところ ansatz から遠ざけておきます。
c++ - 2 階の暗黙的な変換
次のコードを検討してください。
最近まで、標準とコンパイラは、必要な変換シーケンスが存在する場合にそれを見つけるのに十分「賢い」と考えていました。
つまり、 が に変換され、次に にbool b2 = s
変換s
されると考えていました。しかし、明らかにそれは起こっていません。first
bool
と の同等の動作を取得するための正しいアプローチは何first
ですかsecond
?
c++ - デフォルトのテンプレート引数を持つ変換演算子
c++ - 演算子は 'void' を取る必要があります
2 つのクラスがあるとします。
Location
aを aに暗黙的に変換したいPoint
:
だから、私はこれoperator
を内部に追加しましたPoint
:
Debian でコンパイルするとg++ 4.9.2
、次のエラーが表示されます。
コンパイラは演算子が引数を受け入れないようにしているように思えますが、演算子を間違って使用していない限り、それは正しくないようです。このエラーの背後にある本当の意味は何ですか?
c++ - 複数の関数と複数の変換演算子によるオーバーロードの解決
簡単なコードを考えてみましょう:
上記のコードは正常に動作し、予想どおりgcc、clang、および VC++がfoo(char)
.
コードを少し変更します。
これで choose が必要になりましたが、 clang と gccが上記のコードに満足していないのに対し、 VC++foo(double)
だけがこのコードに満足しているようです。
上記のコードが失敗する理由を誰か説明できますか? それともバグですか?
もう 1 つの質問: gcc と clang はオーバーロード解決のコードを共有していますか?
c++ - 変換演算子による明示的にインスタンス化されたテンプレート関数の呼び出し
次のような明示的なインスタンス化の助けを借りて、cpp ファイルに実装されている関数テンプレートがあるとします。
関数.h
関数.cpp
次のように、 function.hを含むメイン ファイルで関数を呼び出すことができるようになりました。
さらに、次のように実装されたクラスがあると仮定します。
data.h
次のコードでは、リンカー エラー LNK2019: unresolved external (Visual Studio 2010) が発生します。
次の式のいずれかを使用して、 to function()を指定できます。
しかし、 function(a)を単に呼び出すことができないのはなぜですか? function()をデータ型で明示的にインスタンス化せずにそれを達成するための他の解決策はありますか?